JPA学习笔记-EJB-05JPA实体对象状态和实体对象的高级操作--2(实体监听器)

1.      实体监听器的使用

在增、删、改操作之前、和之后都可以添加监听器,来监视对象CURD的操作状态或日志写入。类似于AOP的思想,监听器方法在准备执行增、删、改或者执行完增、删、改之后想做一些自己的操作,那么监听器是一个不错的选择,当然使用SpringAOP或者仅仅使用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");

    }

}

在实体类前面加入@EntityListeners(DefaultEntityListener.class)注解就可以了。那么所有标记了此注解的实体Bean生命状态发生变化后都会调用相关的监听方法。

3.      每个实体类单独配置监听器(一般不会使用此策略)

将监听方法写在实体Bean中,用注解告诉JPA实体管理器,此类有生命周期状态需要监听。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值