一、Hibernate的接口分佈圖:
我先對該接口分佈圖進行一下講解:
1.位於最底層的JNDI,JDBC和JTA是J2EE13個技術規範中的三個規範。
2.位於PersistenceLayer持久層的是Hibernate封裝好的接口,用到時直接使用,不需要對其進行實現。
3.位於Business Layer業務邏輯層的Lifecycle,Validatable和Persistent Classes是與業務邏輯層進行打交道的。
其中Lifecycle接口和Validatable接口放在這裏是因爲之前的Hibernate的實體對象需要通過實現Lifecycle接口和Validatable接口才能觸發一些特定的處理及驗證(它倆是侵入性的);但是現在Hibernate又提供了新的Interceptor接口,是一種非侵入性的攔截機制,也可以實現相應的功能。
至於Persistent Classes就是持久化類,也就是咱們所說的實體類,需要自己編寫,所以放在了業務邏輯層。
二、Hibernate的接口分類:
1)核心接口:
1、Configuration接口
Configuration用於配置並啓動Hibernate。
Configuration可以創建相應的SessionFactory實例。
2、SessionFactory接口
一個SessionFactory對應一個數據源,一個數據庫對應一個SessionFactory。
它是線程安全的,同一個實例可以被應用中的多個線程共享。
它是個重量級對象,通過查看Hibernate的源碼,發現SessionFactory存放了大量預定義的SQL語句以及映射元數據,所以需要很大的緩存,因爲有了Mapping文件,很多SQL語句就已經確定了,只需要動態生成一次就可以了(不可隨意生成多個實例),這個設計也是爲了提高持久化的效率。
3、Session接口
從SessionFactory中可以獲得Session實例。
Session接口是Hibernate應用中使用最廣泛的接口,它是持久化管理器,提供添加、更新、刪除、加載、查詢對象。
Session不是線程安全的,所以應避免多個線程共享同一個Session實例。
Session是輕量級對象,它的創建和銷燬不需要太多資源,這意味着在應用中可以經常創建和銷燬Session對象。
Session有一個緩存,稱之爲Hibernate的一級緩存,它存放當前工作單元加載的持久化對象,每個Session都有自己的緩存,緩存中的對象只能被當前工作單元訪問。
4、Transaction接口
Transaction是Hibernate的數據庫事務接口,它對底層事務接口進行了封裝。
Hibernate應用可以通過一致Transaction接口來聲明事務邊界,這有助於應用可以在不同的環境或容器中移植。具體的事務實現使用在Hibernate.properties中進行指定。
5、Query和Criteria接口
這兩個是Hibernate的查詢接口,用於向數據庫查詢對象,以及控制執行查詢的過程。
Query實例包裝了一個HQL(Hibernate Query Language)來查詢。
Criteria接口完全封裝了基於字符串形式的查詢語句,比Query更面向對象,Criteria更擅長執行動態查詢。
這5個核心接口是我們在使用Hibernate時經常用到的,下面列舉一個查詢的示例,通過這個示例我們可以對這5個接口有一個清晰的認識:
public static void main(String[] args) {
//Configuration讀取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
//Configuration建立SessionFactory實例
SessionFactory factory = cfg.buildSessionFactory();
//取得Session
Session session = null;
try {
session = factory.openSession(); //SessionFactory創建Session實例
//開始事務
session.beginTransaction();
//使用Query查詢
List users = session.createQuery("from User").list();
//使用Criteria查詢
//List users =session.createCriteria(User.class).list();
//提交事務
session.getTransaction().commit();
} catch(Exception e){
e.printStackTrace();
//回滾事務
session.getTransaction().rollback();
} finally {
if (session != null){
if (session.isOpen()){
//關閉session
session.close();
}
}
}
}
2)回調接口:
1、Lifecycle接口
實體對象通過實現Lifecycle接口,即可以在特定的持久化階段,觸發特定的處理過程。
2、Validatable接口
Validatable接口定義了數據驗證實現方式。實體對象實現Validatable接口,並在validate方法中對當前待保存的數據進行驗證,以保證數據的邏輯合法性。
3、Interceptor接口
以上2種方法都要求實現Hibernate中的Lifecycle或Validatable接口,具有很大的侵入性,使得實體對象的移植很不方便。Hibernate又提供了一種攔截機制,爲對象持久化事件的捕獲和處理提供了一個非侵入性的實現。
實現Interceptor接口,在創建session時,指定加載Interceptor相應的實現類,此session的持久化操作都將首先經由此攔截器捕獲處理。
3)映射類型接口:
Type接口:表示Hibernate映射類型,用於把域對象映射爲數據庫關係數據。
4)可擴展接口:
1、定製主鍵的生成策略:IdentifierGenerator接口
2、定製緩存機制:Cache和CacheProvider接口
3、定製本地SQL方言:Dialect抽象類
4、定製事務管理:TransactionFactory,Transaction和TransactionManagerLookup接口
5、定製ORM策略:ClassPersister接口
6、定製屬性訪問策略:PropertyAccessor接口
7、創建代理:ProxyFactory接口
對於Hibernate中的接口,我們只需要熟知它的核心接口即可,其它的可作爲了解。