JPA學習筆記-EJB-05JPA實體物件狀態和實體物件的高階操作--2(實體監聽器)
1. 實體監聽器的使用
在增、刪、改操作之前、和之後都可以新增監聽器,來監視物件CURD的操作狀態或日誌寫入。類似於AOP的思想,監聽器方法在準備執行增、刪、改或者執行完增、刪、改之後想做一些自己的操作,那麼監聽器是一個不錯的選擇,當然使用Spring的AOP或者僅僅使用AspectJ在業務DAO作為執行前、後的使用者個性化操作也是不錯的。只是這種實體監聽器僅僅針對於JPA實體Bean的。而查詢方法,只有Load僅有一個查詢之後才能呼叫的監聽方法,在Load執行之前的監聽方法是沒有的。
如表所描述:
註解名稱 |
說明 |
@PrePersist |
在持久化實體之前呼叫 |
@PostPersist |
在持久化實體之後呼叫 |
@PreUpdate |
在Updaye實體之前呼叫 |
@PostUpdate |
在Update實體之前呼叫 |
@PreRemove |
在刪除實體之前呼叫 |
@PostRemove |
在刪除化實體之前呼叫 |
@PostLoad |
在載入實體之後呼叫 |
需要說明的就是,如果方法中發生了任何異常,那麼事務會回滾。實際上實體監聽器就是實體生命週期的回撥函式。
設定實體監聽器有三種方式:
1. 配置檔案方式——預設方式
通過配置/META-INF/orm.xml檔案為每一個實體Bean都加上監聽器。
配置檔案如下:
<entity-mappings xmlns xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0"> <persistence-unit-metadata> <persistence-unit-defaults> <entity-listeners> <entity-listener class="jpalistener.DefaultEntityListener"> <pre-persist method-name="perAdd"></pre-persist> <pre-remove method-name="perRemove"></pre-remove> <pre-update method-name="perUpdate"></pre-update> <post-update method-name="postUpdate"></post-update> <post-remove method-name="postRemove"></post-remove> <post-persist method-name="postAdd"></post-persist> <post-load method-name="postLoad"></post-load> </entity-listener> </entity-listeners> </persistence-unit-defaults> </persistence-unit-metadata> </entity-mappings> |
如果類前面加入@ExcludeDefaultListeners則該實體監聽器無效。
2. 單獨的監聽器類(較為常用)
監聽器類如下
DefaultEntityListener
package jpalistener; import javax.persistence.PostLoad; import javax.persistence.PostPersist; import javax.persistence.PostRemove; import javax.persistence.PostUpdate; import javax.persistence.PrePersist; import javax.persistence.PreRemove; import javax.persistence.PreUpdate; public class DefaultEntityListener { public DefaultEntityListener() { } @PostLoad public void postLoad(Object object) { System.out.println("postLoad"); } @PrePersist public void perAdd(Object object) { System.out.println("perAdd"); } @PostPersist public void postAdd(Object object) { System.out.println("postAdd"); } @PreUpdate public void perUpdate(Object object){ System.out.println("perUpdate"); } @PostUpdate public void postUpdate(Object object){ System.out.println("postUpdate"); } @PreRemove public void perRemove(Object object){ System.out.println("perRemove"); } @PostRemove public void postRemove(Object object){ System.out.println("postRemove"); } } |
3. 每個實體類單獨配置監聽器(一般不會使用此策略)
將監聽方法寫在實體Bean中,用註解告訴JPA實體管理器,此類有生命週期狀態需要監聽。