1. 程式人生 > >JPA學習筆記-EJB-05JPA實體物件狀態和實體物件的高階操作--2(實體監聽器)

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

="http://java.sun.com/xml/ns/persistence/orm"

    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實體管理器,此類有生命週期狀態需要監聽。