Hibernate架構
下圖提供了hibernate體系的高層視圖:

Hibernate全面解決方案:
Hibernate核心API
Configuration
負責管理資料庫的配置資訊。資料庫的配置資訊包含了Hibernate連接配接資料庫的一些基本資訊(hibernate.cfg.xml),Configuration對象可以通過加載配置檔案擷取并管理這些資訊.
Configuration config = new Configuration().configure();
或者:
File file = new File(“C:\\myhibernate.xml”);
Configuration config = new Configuration().configure(file);
SessionFactory (org.hibernate.SessionFactory)
針對單個資料庫映射關系經過編譯後的記憶體鏡像,是線程安全的(不可變)。 作為 Session
的工廠和 ConnectionProvider 的客戶。SessionFactory 可以在程序或叢集的級别上,為那些事務之間可以重用的資料提供可選的二級緩存。
SessionFactory使用要點如下:
1. 負責建立Session對象,可以通過Configuration對象建立SessionFactory對象
2. SessionFactory 對象中儲存了目前的資料庫配置資訊和所有映射關系以及預定義的SQL語句。
3. SessionFactory還負責維護Hibernate的二級緩存。
4. SessionFactory對象的建立會有較大的開銷,而且SessionFactory對象采取了線程安全的設計方式,是以在實際中SessionFactory對象可以盡量的共享,在大多數情況下,一個應用中針對一個資料庫可以共享一個SessionFactory執行個體
SessionFactory建立代碼如下:
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session (org.hibernate.Session)
表示應用程式與持久儲存層之間互動操作的一個單線程對象,此對象生存期很短。其隐藏了
JDBC 連接配接,也是 Transaction 的工廠。它會持有一個針對持久化對象的必選(第一級)緩存,在周遊對象圖或者根據持久化辨別查找對象時會用到。
Session定義了添加、更新、删除和查詢等操作,是持久化操作的基礎。Session的設計是非線程安全的,是以,一個Session對象隻可以由一個線程使用。
Session對象可以由SessionFactory對象建立。
Session session = factory.openSession();
Transaction
将應用代碼從底層的事務實作中抽象出來——這可能是一個JDBC事務,一個JTA使用者事務或者甚至是一個公共對象請求代理結構(CORBA)——允許應用通過一組一緻的API控制事務邊界。
使用Hibernate進行操作時(增、删、改)必須顯示的調用Transaction(預設:autoCommit=false)
Transaction tx = session.beginTransaction();
Hibernate對象的狀态和生命周期
◦ 注意:
◦ 使用debug詳細觀察程式運作,加深了解。
Transient 瞬時/臨時态
} 使用new 操作符初始化的對象不是立刻就持久的。
} 跟session沒有任何關系
} 跟資料庫沒有任何關系,資料庫中沒有對應記錄存在
Persist 持久态
} 和session對象相關。以map形式存入到session中
} 在資料庫中有對應的記錄
Detached托管/遊離态
} 和session對象無關
遊離态,托管态的經典案例
學生對班級的模型,多對一模型。班級端放棄關系的維護權,學生端維護
案例:修改學生資訊的時候,如何維護與班級的關系
新傳入的student對象中的班級引用為空,如果直接update儲存關系丢失。
需要進行關系維護。
先從資料庫中查出原先該id對應的學生對象。将班級取出,與新的student建立關系。
由于原先的和新修改的id相同,hibernate會報異常。則必須将原先的從持久态變成遊離态。再儲存新的student對象
View Code