1. 程式人生 > >Hibernate官方文件翻譯-(第二章,入門)

Hibernate官方文件翻譯-(第二章,入門)

第二章:使用原生Hibernate API 和hbm.xml對映

(示例程式碼下載地址http://sourceforge.net/projects/hibernate/files/hibernate4/

2.1. Hibernate configuration 檔案
資原始檔hibernate.cfg.xml定義了Hibernate的配置資訊。
比如說connection.driver_class,connection.url,connection.username 和connection.password等屬性元素定義了JDBC連線的資訊。由於本套教程利用了H2的“記憶體間”(in-memory)模式,所以以上這些屬性的值都是執行在H2的in-memory模式上的特定的值。connection.pool_size是用來配置在Hibernate內建連線池的連線數。
(重要:Hibernate內建連線池不是專門為生產環境使用的,他缺少了許多生產環境下連線池該有的特性)。
“dialect”屬性指定了Hibernate將會轉換的目標特定SQL變體(如MySQL的具體語句,Oracle的具體語句等)。
(提示:在大多數情況下,Hibernate能夠正確地判斷使用哪種dialect,這對於面對多種資料庫的應用就非常有用)。

“hbm2ddl.auto”屬性讓Hibernate能夠直接給資料庫生成簡單元資料綱要(如資料庫,資料庫表結構等)。
最後,為持久化類新增對映檔案到配置中,mapping元素的“resource”屬性促使Hibernate嘗試定位該對映作為類路徑的資源,並且使用java.lang.ClassLoader來搜尋。
2.2. 實體類
本教程的實體類為org.hibernate.tutorial.hbm.Event。
關於實體類的說明:
》Event類使用標準的JavaBean命名規範,為屬性生成getter和setter方法,並且所有欄位都為private的,儘管這是推薦的設計方法,但卻不是必須不可的。
》同樣作為JavaBean命名規範的無參建構函式,也是所有持久化類應有的。因為Hibernate需要使用反射機制來為我們建立這些類的物件。構造方法可以使private的,但是包內可見或者全域性可見(package或者public可見)是執行時生成代理和非位元組碼除錯高效資料檢索的必須。
2.3. 對映檔案
本教程的對映檔案hbm.xml路徑為/org/hibernate/tutorial/hbm/Event.hbm.xml。
Hibernate使用對映的元資料來決定如何載入和儲存持久化物件,Hibernate對映檔案是為Hibernate提供這些元資料的一種選擇。


例:2.1 class 對映元素
<class name="Event" table="EVENTS">

</class>


class 元素的功能:
1.name屬性指定了將會作為持久化的實體類名(要結合package屬性)。
2.table屬性指定了包含該實體資料的資料庫表。
有了class屬性之後,現在Event類的所有例項化物件就與資料庫中EVENTS表中
的行一一對應了。


例:2.2 id 對映元素
<id name="id" column="EVENT_ID">

</id>
Hibernate使用id元素的指定的屬性值來唯一的標誌表中的每一行。


(重要:id元素不是必須得對映到表中的primary key(主鍵),但是這事傳統的做法。在Hibernate中被對映的表甚至不需要主鍵。儘管如此,還是強烈建議所有的元資料都定義引用完整性。因此id和主鍵在Hibernate的文件中都可交換使用)。


ID元素標誌了EVENT_ID列作為EVENTS表的主鍵,同時也標誌了類Event的ID欄位包含了唯一標誌的值。


generator元素巢狀在id元素內部告知Hibernate使用哪種策略來為實體類生成主鍵。


例:2.3. property 對映屬性
<property name="data" type="timestamp" column="EVENT_DATE"/>
<property name="Title"/>


以上兩個屬性元素聲明瞭Event剩下的兩個欄位:date和title。date屬性包含了column屬性,但是title屬性沒有。如果沒有指定column屬性,Hibernate使用相同的屬性名來作為column(列)名。title剛好可以做到讓類欄位名和資料庫表列名一致,但是由於date是大多數資料庫保留的關鍵字,因此需要為date指定另外的列名。
title元素缺少了type屬性,在對映檔案中的type屬性既不是Java的型別也不是SQL資料庫中的型別,而是Hibernate對映型別。Hibernate對映型別是在Java和SQL之間充當翻譯官的轉換器。如果type 屬性沒有在對映中被指定,Hibernate會自動嘗試使用正確的轉換,原理是通過Java反射機制來判斷。


某些情況下這種自動的探測可能不會選擇到你期望或者需要的預設型別,就像date屬性一樣,Hibernate無法知道java.util.Date型別應該對映到SQL中的DATE,TIME還是TIMESTAMP型別。在對映檔案中完整的日期和時間資訊應該對映到timestamp轉換器,在Hibernate中是org.hibernate.type.TimestampType型別。


2.4. 示例程式碼
類org.hibernate.tutorial.hbm.NativeApiIllustrationTest展示瞭如何使用Hibernate本地的API。
(提示:被教程的所有示例程式碼都是在JUnit下測試,為了容易,一個方法就是在@before和@after下分別建立和銷燬SessionFactory)。
例:2.4. 獲得org.hibernate.SessionFactory
protected void setUp() throws Exception {
    // 一個程式中SessionFactory只要建立一次
    sessionFactory = new Configuration()
            .configure() // configures settings from hibernate.cfg.xml
            .buildSessionFactory();
}


工作流程:
1.載入配置檔案
最先察覺配置檔案的就是org.hibernate.cfg.Configuration類。本教程所有配置細節都在http://hibernate.org/documentation/quickstart/en-US/html/ch02.html#hibernate-gsg-tutorial-basic-config
2.建立org.hibernate.SessionFactory
然後org.hibernate.cfg.Configuration建立org.hibernate.SessionFactory物件,org.hibernate.SessionFactory物件是一個執行緒安全的物件,在整個應用中只需要例項化一次(單例模式)。
3.SessionFactory建立Session例項。
SessionFactory作為Session例項的一個工廠,可以在示例程式碼中testBasicUsage方法中看到。
4.Session物件開始工作
一個session物件應該要執行一個單一的工作單元。


例:2.5. 儲存實體(持久化實體)
Session session = sessionFactory.openSession();
session.beginTransaction();
session.save( new Event( "Our very first event!", new Date() ) );
session.save( new Event( "A follow up event", new Date() ) );
session.getTransaction().commit();
session.close();




testBasicUsage方法首先建立一些Event物件,使用save方法將之傳遞給Hibernate管理,Hibernate負責使用INSERT語句將他們插入到資料庫。


例:2.6. 獲得一系列實體物件
session = sessionFactory.openSession();
session.beginTransaction();
List result = session.createQuery( "from Event" ).list();
for ( Event event : (List<Event>) result ) {
    System.out.println( "Event (" + event.getDate() + ") : " + event.getTitle() );
}
session.getTransaction().commit();
session.close();




testBasicUsage展示瞭如何使用Hibernate Query Language(HQL:Hibernate查詢語言)來載入資料庫中所有Event物件的,生成適當的SELECT SQL語句,傳送到資料庫並且使用返回的結果集填充Event物件。


2.5. 更深入地。。。
實際操作練習:
》重新配置示例程式碼連線到你自己的資料庫