Hibernate學習總結(2)
3.Hibernate核心介面
3.1Configuration介面
Configuration物件用來配置和引導Hibernate,一個Hibernate應用使用一個Configuration例項來指定主配置檔案的位置,然後建立會話工廠。
Configuration cfg = new Configuration().configure("/cfg/auction.cfg.xml")
在我們的程式碼中,配置檔案是自動探測的,Configuration cfg = new Configuration().configure();configure()方法未帶引數的時候,Hibernate會在classpath的根路徑搜尋名為hibernate.cfg.xml的檔案,如果沒有找到將會丟擲異常。這就是為什麼我們要將Hibernate主配置檔案命名為hibernate.cfg.xml,並且將其放在src目錄下(src目錄對映到編譯後的classpath根路徑)的原因。
3.2SessionFactory介面
一個Hibernate應用從SessionFactory(會話工廠)裡獲得會話例項。
一般情況下,整個應用只有唯一的一個SessionFactory,它應該在應用初始化時被建立。
它是一個重量級、單例項介面,建立時消耗資源較多,而且它只需要存在一個物件就夠了。可以編寫一個工具類,將SessionFactory的例項設定為靜態成員(只在記憶體中存在一份)並將其初始化放在靜態初始化塊中(只執行一次)。例如:
import org.Hibernate.SessionFactory; import org.Hibernate.cfg.Configuration; import org.Hibernate.service.ServiceRegistry; import org.Hibernate.service.ServiceRegistryBuilder; public class HibernateUtil { private static SessionFactory sessionFactory;//靜態變數 static {//靜態初始化塊 try { Configuration cfg = new Configuration().configure(); //Hibernate4提供的新方式 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(cfg.getProperties()).buildServiceRegistry(); sessionFactory = cfg.buildSessionFactory(serviceRegistry); } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } public static void shutdown() { getSessionFactory().close(); } }
3.3Session介面
Session(會話)介面是Hibernate應用使用的主要介面,它擁有操作持久化物件的一系列API,可用於管理(例如載入和儲存)物件,因此我們也稱之為“持久化管理器”。
Session例項是輕量級的,建立與銷燬的代價不昂貴,通常我們會為每個事務建立一個Session例項,並在使用後關閉它。
3.4Transaction介面
Transaction(事務)介面是對實際事務實現的一個抽象,這些實現包括JDBC事務或者JTA事務等。
在Transaction介面中主要定義了commit()和rollback()兩個方法,前者是提交事務的方法,後者是回滾事務的方法。
3.5Query介面
Query(查詢)介面允許在資料庫上執行查詢,並控制查詢如何具體執行。查詢使用HQL或SQL。Query例項可用來繫結查詢引數,限定查詢返回的結果數,並且最終執行查詢。
4.Hibernate中實體物件的三種狀態
實體物件的生命週期是Hibernate 應用中的一個關鍵概念
實體物件的三種狀態:
(1)瞬時狀態(Transient)
剛用new語句建立,還沒有被持久化,且不處於Session的快取中
(2)持久狀態(Persistent)
已經被持久化,且加入到Session的快取中
(3)遊離狀態(Detached)
已經被持久化,但不再處於Session的快取中
app操作物件狀態,在某一時刻,Hibernate會將物件狀態同步到資料庫
瞬時物件的狀態的改變不會被同步,直到它變成一個持久狀態
遊離物件的狀態的改變不會被同步,直到它變成一個持久狀態
實體物件的三種狀態的轉換:
new產生的物件—瞬時態通過save saveOrUpdate方法轉換為持久態,通過delete方法可以將物件變回瞬時態;
開始通過get()、load()方法等進入持久態;
通過evict()、clear()方法或session關閉之後,原有的持久態就變成了遊離態,遊離態通過update()、saveOrUpdate()、lock()方法可重新回到持久態,並在事務提交的時候和資料庫同步session的get load()方法可直接獲得一個持久態物件;
持久態和遊離態的共同點在於,都有資料表的一行與之對應,不同的是,持久態在session範圍內(在快取區中),而遊離態不在session範圍內。
其中evict()方法是清除快取中的指定物件或集合、clear()方法是清空快取。