讀書總結 Hibernate的事件框架

2021-04-13 11:29:13 字數 2741 閱讀 3329

通常,載hibernate執行持久化的過程中,應用程式無法參與其中。因為所有的資料持久化操作,對使用者都是透明的,所以使用者無法加入自己的動作。 

通過事件框架,hibernate允許應用程式能響應特定的內部事件,從而實現某些通用的功能,或者允許對hibernate功能進行擴充套件。

hibernate的事件框架由以下兩部分組成。

●***機制:對於特定動作攔截,**應用中的特定動作。

●事件系統:重寫hibernate的事件***。

1.***:

通過inteceptor介面,可以從session中**應用程式的特定方法,這種**機制可讓應用程式在持久化物件被儲存,更新,刪除或載入之前,對其進行檢查並修改其屬性。

通過inteceptor介面,可以在資料進入資料庫之前,對資料進行最後的檢查,如果資料不符合要求,則可以修改,從而避免非法資料進入資料庫。當然,通常無須這樣做,只有在某些特殊的場合下,才考慮使用***完成檢查功能。

使用***時按如下步驟進行:

(1)定義實現interceptor介面的***類。

(2)通過session起用***,或者通過configuration啟用全域性***。

下面是乙個***的簡單示例的**:

public class myinterceptor extends emptyinterceptor

}***的使用有兩種方法:

●通過sessionfactory的opensession(interceptor in)方法開啟乙個帶區域性***的session。

●同過configuration的setinterceptor(interceptor in)方法設定全域性***。

下面是使用***的示例的部分**:

public class hibernateutil catch (throwable ex)

}public static final threadlocal session = new threadlocal();

public static session currentsession(interceptor it) throws hibernateexception

return s;

}public static void closesession() throws hibernateexception

}2.事件系統:

hibernate3事件系統是功能更強大的事件框架,該事件系統可以替代***,也可以作為***的補充來使用。

基本上,session介面的每個方法都有對應的事件。比如loadevent,flushevent等。事實上,當session呼叫某方法時,hibernate session會生成對應的事件,並啟用對應的事件***。在系統預設***實現的處理過程中,完成了對所有的資料持久化的操作,包括插入和修改等操作。如果使用者定義了自己的***,則意味著使用者必須完成物件的持久化操作。

例如,可以在系統中實現並註冊loadeventlistener,該***負責處理所有呼叫session的load()的方法的請求。

由於***是單態模式物件,即所有的同型別的事件處理共享同乙個***例項,因此,此***不應該儲存任何狀態,即不應該使用成員變數。

使用事件系統時按如下步驟進行:

(1)實現自己的事件***類。

(2)註冊自定義事件***,代替系統預設的事件***。

實現使用者的自定義***有如下三個方法:

●實現對應的***介面:這是不可思議的,實現介面必須實現介面內的所有方法,關鍵是必須實現hibernate對應的持久化操作,即資料庫訪問,這意味著程式設計師完全取代了hibernate的底層操作。

●繼承事件介面卡:可以選擇地實現需要關注的方法,但依然需要替代hibernate完成資料庫訪問。這也不太現實。

●繼承系統預設的事件***:擴充套件特定的方法。

實際上,前兩種方法很少使用。因為hibernate的持久化操作也是通過這些***實現的,如果使用者取代了這些***,則應該自己實現持久化操作,這意味著使用者放棄了hibernate的持久化操作,而改為自己完成hibernate的核心操作。

通常我們採用第三種方法實現自己的事件***。因為hibernate預設的事件***被宣告成non-final,從而方便使用者繼承。

下面是使用者自定義***的示例:

//自定義loadlistener,繼承預設的defaultloadeventlistener實現類

public class myloadlistener extends defaultloadeventlistener

}註冊使用者自定義***也有以下兩種方法。

●程式設計式:通過使用configuration物件程式設計註冊。

●宣告式:在hibernate的xml格式的配置檔案中進行宣告,使用properties格式的配置檔案將無法配置自定義***。

通過程式設計式方式使用自定義***時,只需將hibernateutil中的靜態塊兒用如下的靜態塊兒替代即可:

static catch(throwable ex)  

}使用宣告式方式使用自定義***時,可在hibernate配置檔案中的元素中增加:

子元素即可。

使用配置檔案註冊事件***雖然方便,但也有不利之處:通過配置檔案註冊的監視器不能共享例項;如果有多個元素中使用了相同的類,則每個引用都將產生乙個新***例項;如果需要在多個事件之間共享***的例項,則必須使用程式設計式方式來註冊事件***。

雖然***類實現了特定***的介面,但在註冊時還要明確指出註冊的事件。因為乙個類可能實現多個***的介面,所以,在註冊時明確指定要監聽的事件,可以使得啟用或者禁用某個事件的監聽配置工作更加簡單。 

Spring管理Hibernate中的事務 2

這裡我們將把事務交給spring,不需要手動開關 上面的org.springframework.orm.hibernate3.hibernatetransactionmanager代替了我們手動開關事務的切面,這個spring 提供的類更加強大,可以為我們的事務設定屬性,可以通過設定異常回滾或其它。...

spring 整合Hibernate注意事項

再倒入spring的jar包時注意 下面的3個包都要匯入,否則就會出現錯誤。原因沒有搞懂 還有在myeclipes下匯入hibernate工程時選擇copy的選項,好像是因為spring包與hibernate包衝突造成的 myeclipes新增spring工程和hibernate工程時先後順序沒有什...

spring 整合Hibernate注意事項

再倒入spring的jar包時注意 下面的3個包都要匯入,否則就會出現錯誤。原因沒有搞懂 還有在myeclipes下匯入hibernate工程時選擇copy的選項,好像是因為spring包與hibernate包衝突造成的 myeclipes新增spring工程和hibernate工程時先後順序沒有什...