就是愛分享
Hibernate 是「物件/關係對應」(Object/Relational Mapping)的解決方案,簡寫為 ORM,簡單的說就是將 Java 中的物件與物件關係,映射至關聯式資料庫中的表格與表格之間的關係, Hibernate 提供了這個過程中自動對應轉換的方案。

2001 年未 Hibernate 第一個版本發表,2003年6月8日 Hibernate 2 發表,並於年未獲得 Jolt 2004 大獎,後被 JBOSS 收納而成為其子項目之一,2005年3月 Hibernate 3 正式發表,當中有了一些重大的改變,這份文件將以之前 Hibernate 2 時撰寫的文件為基礎,針對 Hibernate 3 作重新整理的動作,所使用的版本為 Hibernate 3.2。

在撰寫 Hibernate 程式的過程中,我們可以粗分四大步驟(1~4) 與二大檔案(5、6),依序是 :

1. Configuration:

1.1. 透過 Configuration File (hibernate.cfg.xml) 設定與 Database 連線的方式與設定要匯入哪些 Mapping File。

1.2 (JavaEE 環境) 透過 JNDI Service 來註冊 org.hibernate.SessionFactory 成為 Global 物件。

1.3 (JavaEE 環境) 設定 AP Server 所提供的 Transaction 的功能。

1.4. 透過 org.hibernate.cfg.Configuration 的 configure() mathod 來讀取 Configuration File。

1.5 透過 org.hibernate.cfg.Configuration 的 buildSessionFactory() 來產生 下一步驟要用到的 org.hibernate.SessionFactory 。

2. SessionFactory:

2.1 一個 org.hibernate.SessionFactory 只對應到一個 Database

2.2 必須在程式要使用之前就必須建立好 SessionFactory,因為需要一點時間才能建立,所以最好是在網站或程式初始化時就去建立,至少必須在程式開始接觸 Database 之前就要建立。

2.3 必須放在所有程式都可以取用到地方 ( 有 JNDI 就註冊到 JNDI 中, 如果沒有 JNDI, 且是Web Apps, 也可以註冊在 ServletContext)。

2.4 org.hibernate.SessionFactory 會 catch 執行 Hibernate 所產生的 SQL statement 和 Database 的 metadata。

2.5 org.hibernate.SessionFactory 是 thread-safe 物件,會自己處理 multi-thread。

2.6 透過 org.hibernate.SessionFactory 的 openSession() 或是 getSession() 來 產生/取得 下一步驟要用到的 org.hibernate.Session。

3. Session:

3.1 org.hibernate.Session 包含了 JDBC 的 Connection object。

3.2 所以可以視為 Hibernate 與 Database 之間溝通的橋樑、過程。

3.3 org.hibernate.Session 可以提供 org.hibernate.Transaction object

3.4 所以存取 Persistent Class 都需要透過 org.hibernate.Session 。

4. Transaction:

4.1 org.hibernate.Transaction 將真正在底層執行 Transaction service包裝起來,

在 J2EE 中使用 JTA 的 UserTransaction 服務多個 Database (ex: 轉帳);或利用 J2SE 中 JDBC 的 Transaction 來服務一個 Databae。

4.2 在 Hibernate 3.x 中,存取 Persistent Class 的動作一定要包在 org.hibernate.Transaction 的可視範圍之中。

例如:Transaction transaction = session.beginTransaction();

存取 Persistent Class ...
......

transaction.commit();

5. Persistance Class:

5.1 最好是 JavaBeans 的架構。

5.2 使用 Hibernate 來處理的 Table 一定要有 primary key,且對應到 Java Class 中的 欄位與 setter,為了避免誤改,所以都應該宣告為 private 屬性。primary key 是獨一無二的 id,所以在選定時最好避免與目前專案相關性太高的欄位,應儘量使用流水號。

5.3 不要使用 final。Hibernte 會自動為每個 Persistent Class 產生各自的 proxy,但 proxy 會繼承 Persistent Class,所以一旦設為 final,將會限制 proxy 所提供的功能。

5.4 要小心處理 Persistent Class 的三種狀態:
transient : 尚未跟 Persistent Context 接觸。( 與 Session 沒有關係的狀態 )
persistent : 正在跟 Persistent Context 接觸。
detached : 以前曾經跟 Persistent Context 接觸,但現在分開了。

6. Hibernate Mapping File:

6.1 每一個 Persistent Class 都會有自己的 Mapping File,以維護 Table 與 Persistent Class 的對應關係。

6.2 Mapping File 的副檔名為 .hbm.xml。

6.3 Mapping File 的存放位置必須跟所對應的 Persistent Class 的目錄相同。

6.4 在使用 Mapping File 之前必須註冊到 Configuration file 中,通常使用靜態的方法,直接寫入 hibernate.cfg.xml 中。
標籤: | edit post
0 Responses