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实体管理器,此类有生命周期状态需要监听。
分享到:
相关推荐
虽然持久化实体的状态在ORM中是一个老生常谈的问题,...在Web一般情况下也都是交给Spring去管理实体管理器(EntityManager),所以我们还是有必要啰嗦一下,至于肢体的高级操作,实际上也就是实体监听器的使用而已。
10.8 实体的生命周期和监听器 444 10.8.1 实体的生命周期与回调事件 444 10.8.2 使用专门的监听器实现回调 448 10.8.3 为全部实体配置默认监听器 450 10.8.4 排除监听器 452 10.9 本章小结 455 第11章 JPA的查询支持...
实体监听、实体管理器、实体合并、实体序列化、实体主键、实体关系 实体二级表、实体更新、实体、注射、拦截、J2SE JBoss公司、JCA、JNDI、本地远程、管理、消息组件 开放式EJB(16)、持久性、资源、安全、购物车、有...
12.3.4 实体监听器和回调 12.4 小结 第13章 优化抓取和高速缓存 13.1 定义全局抓取计划 13.1.1 对象获取选项 13.1.2 延迟的默认抓取计划 13.1.3 理解代理 13.1.4 禁用代理生成 ...
10.3.1 创建消息监听器 10.3.2 编写纯POJO MDP 10.4 使用基于消息的RPC 10.4.1 引入Lingo 10.4.2 输出服务 10.4.3 代理JMS 10.5 小结 第11章 Spring和EJB 11.1 在Spring中置入EJB 11.1.1 代理会话Bean...
10.3.1创建消息监听器 10.3.2编写纯pojomdp 10.4使用基于消息的rpc 10.4.1引入lingo 10.4.2输出服务 10.4.3代理jms 10.5小结 第11章spring和ejb 11.1在spring中置入ejb 11.1.1代理会话bean(ejb2.x) 11.1.2...
10.3.1 创建消息监听器 10.3.2 编写纯POJO MDP 10.4 使用基于消息的RPC 10.4.1 引入Lingo 10.4.2 输出服务 10.4.3 代理JMS 10.5 小结 第11章 Spring和EJB 11.1 在Spring中置入EJB 11.1.1 代理会话Bean...
11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口 ...
踪、过滤器Filter、监听器Listener等;第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、 资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为Struts框架篇,内容不仅包括Struts 1.x的内 容,也包括...
第2篇为基础篇,内容包括Servlet技术、JSP技术、会话跟踪、过 滤器Filter、监听器Listener等;第3篇为高级篇,内容包括JSTL标签库的 使用、如何自定义标签、资源国际化、数据库概述、JDBC详解、XML概述等 ;第4篇为...
第2篇为基础篇,内容包括Servlet技术、JSP技术、会话跟踪、过滤器Filter、监听器Listener等;第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为...
第2篇为基础篇,内容包括Servlet技术、JSP技术、会话跟踪、过滤器Filter、监听器Listener等; 第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、资源国际化、数据库概述、JDBC详解、XML概述等; 第4篇为...
踪、过滤器Filter、监听器Listener等;第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、 资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为Struts框架篇,内容不仅包括Struts 1.x的内 容,也包括...
第2篇为基础篇,内容包括Servlet技术、JSP技术、会话跟踪、过滤器Filter、监听器Listener等;第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为...
踪、过滤器Filter、监听器Listener等;第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、 资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为Struts框架篇,内容不仅包括Struts 1.x的内 容,也包括...
踪、过滤器Filter、监听器Listener等;第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、 资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为Struts框架篇,内容不仅包括Struts 1.x的内 容,也包括...
踪、过滤器Filter、监听器Listener等;第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、 资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为Struts框架篇,内容不仅包括Struts 1.x的内 容,也包括...
踪、过滤器Filter、监听器Listener等;第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、 资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为Struts框架篇,内容不仅包括Struts 1.x的内 容,也包括...
踪、过滤器Filter、监听器Listener等;第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、 资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为Struts框架篇,内容不仅包括Struts 1.x的内 容,也包括...
踪、过滤器Filter、监听器Listener等;第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、 资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为Struts框架篇,内容不仅包括Struts 1.x的内 容,也包括...