- hibernate的核心類和接口
- Configuration類
-
作用:(1)讀取hibernate.cfg.xml文件
(2)管理對象關系映射文件<mapping resource="">
(3)加載hibernate的驅動,例如:url,用戶名
(4)管理hibernate配置信息
-
- hibernate.cfg.xml
- 對象關系映射文件
- SessionFactory(會話工廠)接口
- 緩存sql語句和某些數據(稱為Session級緩存)
- 在應用程序初始化的時候創建,是一個重量級類(耗內存),一般使用單例模式保證一個應用中只需要一個SessionFactory實例
- 在如果某個應用訪問多個數據庫,則要創建多個會話工廠實例,一般是一個數據庫一個會話工廠實例。
- 通過SessionFactory接口可以獲得Session(會話)實例。
- 示意代碼如下:
1 1 Configuration cf = new Configuration().configure(); 2 2 SessionFactory sf = cf.buildSessionFactory(); 3 3 Session s = sf.getCurrentSession();//或者是:Session s = sf.openSession();
注意:這里有關sf.getCurrentSession()和sf.oopenSession()的區別:openSession()是每次可以獲取一個全新的session;getCurrentSession()獲取的是和當前線程綁定的session,即:在同一個線程中我們獲取的session是同一個session,這樣的話可以利於事務的控制。如果是使用getCurrentSessionn(),需要再hibernate.cfg.xml文件中配置如下:
1 <!--配置可以使用getCurrentSession--> 2 <property name="hibernate.current_session_context_class">thread</property>
在使用過程中openSession()和getCurrentSession()的選擇原則:①如果需要在同一個線程中,保證使用同一個Session時,則使用getCurrentSession();②如果在一個線程中,需要使用不同的Session,則使用openSession();
- openSession()和getCurrentSession區別:
- 采用getCurrentSession()創建的session會綁定到當前線程中,而采用openSession() 創建的session則不會
- 采用getCurrentSession()創建的session在commit或rollback時,會自動關閉,而采用openSession()創建的session必須手動關閉。
- 使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
1 <!--如果使用的是本地事務(jdbc事務)配置可以使用getCurrentSession,--> 2 <property name="hibernate.current_session_context_class">thread</property> 3 <!-- 如果使用的是全局事務(jta事務)--> 4 <properity name="hibernate.current_session_context_class">jta</properity>
- 如何查看session是否及時關閉
- windows:
- 在cmd命令中輸入:netstat -an [oracle 1521/mysql 3306/sql server 1433]
- linux/unix:
- 在命令行中輸入:netstat -an 或者top
- windows:
- session接口的主要作用是:
- session一個實例代表與數據庫的一次操作(一次操作可以使crud組合)
- session實例通過SessionFactory獲取,用完及時關閉
- session是線程不同步的(不安全),因此要保證在同一線程中使用,可以用getCurrentSession()獲取
- session可以看做是持久化管理器,它是與持久化操作相關的接口
- Session(會話)接口的幾個重要方法:
- 保存一個對象(記錄)——save方法
- 刪除一個對象(記錄)——delete方法
- 查詢一個對象(記錄)——get/load方法
- get()和load()區別:
- get()方法直接返回實體類,如果查不到數據則返回null,load()會返回一個實體代理對象(當前這個對象可以自動轉化為實體對象),當代理對象被調用時,如果沒有數據不存在,就會拋出org.hibernate.ObjectNoFoundException異常
- load先到緩存(session緩存/二級緩存)中取查,如果沒有則返回一個代理對象(不馬上到DB中去找),等后面使用這個代理對象操作的時候,才到DB中去查詢,這就是常說的load在默認情況下支持延遲加載(lazy)
- get先到緩存(session緩存/二級緩存)中去查,如果沒有就到DB中去查(即馬上發出sql)。總之,如果確定DB中有這個對象就用load(),不確定就用get()(這樣可以提高效率)。
- get()和load()區別:
- 修改一個對象(記錄)——update方法