核心:
Configuration類負責管理Hibernate的配置信息,Hiber運行時需要獲取一些底層實現基本信息
1.數據庫URL
2.數據庫用戶
3.數據庫用戶密碼
4.數據庫JDBC驅動
5.數據庫dialect,用于對特定的數據庫提供支持,其中包含了針對特定數據庫特性的實現
當調用Hibernate時,Hibernate會自動在當前CLASSPATH,中搜尋配置文件,hibernate.cfg.xml,將其讀到內存中,作為后繼操作的基礎配置
Configuration config=new Configuration().configure();
Configuration類一般只有在獲取SessionFactory時需要涉及,當獲取SessionFactory之后,由于配置信息已經由Hibernate維護并綁定在返回的SessionFactory之上,因此一般情況下無需要再對其進行操作。
也可以不用默認的文件名,使用自定義的文件名,但一定要是.xml格式的
File file=new File("c:/myhibernate.xml");Configuration config=new configuration().configure(file);三、SessionFactorySessionFactory負面創建Session實例
SessionFactory factory=new Configuration().configure().buildSessionFactory();四、Session
Session session=new Configuration().configure().buildSessionFactory().openSession();
之后就可以調用Session所提供的save,find,flush等方法完成持久層操作
在事務提交的時候,hibernate自動執行flush方法
當Session關閉時,也會自動執行flush方法
如果不在事務中,去數據進行增、刪、改、查,需要使用flush(),強制執行數據庫同步
五、事務管理Hibernate是JDBC的輕量級封裝,本身并不具務事務管理能力
Hibernate將事務管理委托給底層的JDBC或者JTA
<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools. --><hibernate-configuration> <session-factory> <!--方言 --> <PRoperty name="dialect"> org.hibernate.dialect.Oracle9Dialect </property> <!--數據庫URL --> <property name="connection.url"> jdbc:oracle:thin:@localhost:1521:orcl </property> <!--數據庫訪問的用戶名 --> <property name="connection.username">accp</property> <!--數據庫訪問的用戶名的密碼 --> <property name="connection.passWord">accp</property> <!--數據庫驅動這里是oracle數據庫的 --> <property name="connection.driver_class"> oracle.jdbc.OracleDriver </property> <property name="myeclipse.connection.profile">oracle</property> <!--是否顯示執行的SQL語句 --> <property name="show_sql">true</property> <!--是否使用數據庫外連接 --> <property name="hibernate.use_outer_join">true</property> <!--事務管理類型 --> <property name="hibernate.transaction.factory_class"> <!-- JDBC事務--> net.sf.hibernate.transaction.JDBCTransactionFactory <!-- JTA事務管理--> <!-- net.sf.hibernate.transaction.JTATransactionFactory --> </property> <!--映射文件配置 --> <mapping resource="com/pb/entity/Login.hbm.xml" /> </session-factory></hibernate-configuration>六、基于JDBC的事務管理
// 得到SessionSession session=new Configuration().configure().buildSessionFactory().openSession();// 打開事務Transaction tran=session.beginTransaction();// 提交事務 tran.commit();
與下面這段Hibernate只是將JDBC進行封裝
//得到數據庫連接 Connection dbconn=getConnection(); //將自動提交設置為false dbconn.setAutoCommit(false); //提交 dbconn.commit();
在openSession()中,hibernate會初始化數據庫連接,與此同時將AutoCommit設置為關閉也就如上面的設置為false。
在session.beginTransaction()方法中Hibernate會再次確認Connection的AutoCommit屬性被設定為關閉狀態。
它是為了防止用戶代碼對Session的Connection.AutoCommit屬性進行修改.
也就是說從SessionFactory()中獲得的Session,其自動提交屬性就已經被關閉.
七、JTA事務管理7.1、JTA簡介java事務API(JTA:Java Transaction API)和它的同胞Java事務服務(JTS:Java Transaction Service),為J2EE平臺提供了分布式事務服務(distributed transaction)。一個分布式事務(distributed transaction)包括一個事務管理器(transaction manager)和一個或多個資源管理器(resource manager)。一個資源管理器(resource manager)是任意類型的持久化數據存儲。事務管理器(transaction manager)承擔著所有事務參與單元者的相互通訊的責任。7.2、JTA與JDBCJTA事務比JDBC事務更強大。一個JTA事務可以有多個參與者,而一個JDBC事務則被限定在一個單一的數據庫連接。下列任一個Java平臺的組件都可以參與到一個JTA事務中:JDBC連接、JDO PersistenceManager 對象、JMS隊列、JMS 主題、企業JavaBeans(EJB)、一個用J2EE Connector Architecture 規范編譯的資源分配器。7.3、JTA特點JTA提供了跨Session的事務管理能力
JTA事務管理則由JAT容器實現,JTA容器對當前加入事務的眾多Connection進行調試
JTA的事務周期可橫跨多個JDBC Connection生命周期
JTA事務是由JTA Container維護,而參悟事務的Connection無需要事務管理進行干涉.
八、事務中的鎖機制業務邏輯的實現過程中,往往需要保證數據訪問的排他性
給我們選定的目標數據上鎖,使用無法被其他程序修改
Hibernate 支持兩種鎖機制:"悲觀鎖"(Pessimistic Locking)和"樂觀鎖"(Optimistic Locking).
8.1、悲觀鎖指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此在整個數據處理過程中,將數據處于鎖定狀態
悲觀鎖的實現往往依靠數據庫提供的鎖機制,也只有數據庫提供的鎖機制才能真正保證數據訪問的排他性,否則即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改數據。
Oracle中的悲觀鎖
select * from login where username='aaaa' for update;

相對于悲觀鎖而言,樂觀鎖機制采取了更加寬松的加鎖機制
樂觀鎖,大多是基于數據版本 (Version)記錄機制實現。
讀取數據時,將此版本號一同讀出,之后更新時,對版本號加一,此時提交數據的版本數據與數據庫表對應記錄的當前版本信息進行比對,如果提交的數據版本號大于數據庫表當前版本號,則予以更新,否則認為是過期數據。
可以將樂觀鎖策略在數據庫存儲過程中實現,對外只開放基于此存儲過程的數據更新途徑,而不是將數據庫表直接對外公開
新聞熱點
疑難解答