菜鳥學SSH(十)——Hibernate核心介面

劉水鏡發表於2014-02-22

在使用Hibernate的時候,我們通常都會用的Configuration、SessionFactory、Session、Transaction、Query和Criteria等介面。通過這些介面可以,不僅可以儲存與取出持久化物件,還可以對事務進行管理。下面對著幾個介面一一介紹:


幾個介面之間的層次關係如下圖:



Configuration:

Configuration是Hibernate的入口,負責將配置檔案資訊載入到記憶體,並建立一個SessionFactory物件,把讀入的配置資訊載入到SessionFactory物件的記憶體裡。


特點:

Configuration物件的作用是除了有讀取配置檔案的功能,還能建立SessionFactory物件。Configuration物件只存在於系統的初始化階段,然後所有的持久化操作都能通過這個SessionFactory例項來進行。

Configuration物件只有在Hibernate 進行初始化的時候才需要建立,當使用Configuration物件的例項建立了SessionFactory物件的例項後,其配置資訊已經繫結在他返回的SessionFactory物件例項中。因此,一般情況下,得到SessionFactory物件後,Configuration物件的使命就結束了。 


用法:

屬性檔案(hibernate.properties):Configuration cfg = new Configuration();
Xml檔案(hibernate.cfg.xml):Configuration cfg = new Configuration().configure();


SessionFactory:

SessionFactory負責建立Session例項,每個SessionFactory例項對應一個資料庫。SessionFactory是重量級的,佔用快取較大,所以每個資料庫只需建立一個SessionFactory例項,當需要操作多個資料庫時,再為每一個資料庫指定一個SessionFactory例項。


特點:

1,執行緒安全,同一個例項可以被應用的多個執行緒共享
2,重量級,不能隨意建立和銷燬他的例項,一個資料庫,只需要建立一個SessionFactory的例項。
3,以後對Configuration物件勢力作出的修改都不會影響已經建立好的SessionFactory例項,如果需要使用基於改動後的Configuration例項的SessionFactory,需要從Configuration物件中重新建立新的SessionFactory例項。


用法:

Configuration config = new Configuration(); 
ServiceRegistry  sr = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); 
SessionFactory sessionFactory = config.buildSessionFactory(sr); 


Session:

Session是Hibernate持久化操作的基礎,負責管理所有與持久化有關的操作,Session與SessionFactory不同,它是輕量級的,也是非執行緒安全的。建立和銷燬不會消耗太多資源,可以為每一個請求分配一個Session。


特點:

1,不是執行緒安全的,應該避免多個執行緒共享同一個Session例項。
2,Session例項是輕量級的。
3,Session物件內部有一個快取,被稱為Hibernate第一快取,他存放被當前工作單元中載入的物件,每個Session例項都有自己的快取。


用法:

Session session = sessionFactory.openSession();

常用方法:
session.save();
session.update();
session.saveOrUpdate();
session.delete();


Transaction:

Transaction負責Hibernate的資料庫事務,其實Hibernate本身並不具備事務管理的能力,只是對底層事務介面進行了封裝,這樣有利於在不同環境或容器中移植,也可以直接訪問底層的事務介面。


用法:

Transaction tx = session.beginTransaction();


Query和Criteria:

Query和Criteria負責Hibernate的查詢操作。

Query例項封裝了一個HQL(Hibernate Query Language)查詢語句,HQL與SQL有些類似,只是HQL是物件導向的,它操作的是持久化類的類名和屬性名,而SQL操作的是表名和欄位名。

Criteria例項完全封裝了字串形式的查詢語句,它比Query例項更加物件導向,更適合執行動態查詢。


本文只是對這幾個介面的一個簡單介紹,它們還有很多需要我們去學習跟了解的地方,這幾個介面有一個共同的目的,就是讓我們用更加物件導向的方式去程式設計。



相關文章