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"); } } |
在实体类前面加入@EntityListeners(DefaultEntityListener.class)注解就可以了。那么所有标记了此注解的实体Bean生命状态发生变化后都会调用相关的监听方法。
3. 每个实体类单独配置监听器(一般不会使用此策略)
将监听方法写在实体Bean中,用注解告诉JPA实体管理器,此类有生命周期状态需要监听。