Entity回调和监听器

记得以前学习Rails时,对domain增删改更新的操作有相应的回调事件,印象特别深刻。希望能在java的ORM产品中也有这一
特性。而现在Java Peresistence规范容许我们在Entity设置回调方法。当事件发生时,entity实例会收到相应的通知,你也可以
单独注册一个监听器来拦截这些事件。
1:@PrePersist和@PostPersist
在任何时刻,只要向数据库中准备插入数据时,@PrePersist事件就会触发,
当插入操作执行完以后@PostPersist事件就会触发
2:@PreUpdate和@PostUpdate
@PreUpdate在entity被更新到数据库之前被触发
@PostUpdate在entity实际更新完成以后被触发
3:@PreRemove和@PostRemove
当entity间接或直接调用了remove()方法之前,@PreRemove就会被触发
当entity真实被删除以后,@PostRemove就会被触发
4:@PostLoad
当调用find()或getReference()方法时,或者在执行JQL查询的时候,即会触发@PostLoad
在Entity类的public,protected,private的任何方法上添加注释,就可以注册回调事件。回调
方法必须是返回void
@Entity
@Table(name="generator")
@EntityListeners({AuditLogger.class})
public class Generator {

protected final Logger logger = LoggerFactory.getLogger(getClass());

@TableGenerator(name="generator",
table="generator_table",
pkColumnName="id_column",
valueColumnName="value_column",
pkColumnValue="Gen_ID",
allocationSize=1)
@Id
@GeneratedValue(strategy=GenerationType.TABLE,generator="generator")
private Long id;
@Transient
private String name;

@PrePersist
public void preAdd() {
logger.info("before persist Generator");
}

@PostPersist
public void postAdd() {
logger.info("after persist Generator");
}
...

Entity监听器是一个能拦截entity回调事件的类。可以指定监听器的方法使其拦截特定声明周期事件。
这些方法返回void,并接受一个触发事件的entity实例参数。
	public class AuditLogger {

protected final Logger logger = LoggerFactory.getLogger(getClass());

@PrePersist
public void beforeAdd(Object entity) {
logger.info("interceptor before persist {}", entity.getClass().getSimpleName());
}

@PostPersist
public void afterAdd(Object entity) {
logger.info("interceptor after persist {}", entity.getClass().getSimpleName());
}
}

通过@EntityListeners注释使得监听器与entity挂钩。可以为entity指定多个监听器,而执行的顺序为
他们声明的顺序。并且监听器方法会在entity回调方法之前执行、
下面是执行的日志:
8063 [main] INFO com.javaeye.jpa.interceptor.AuditLogger - interceptor before persist Generator
8063 [main] INFO com.javaeye.jpa.domain.Generator - before persist Generator
8235 [main] INFO com.javaeye.jpa.dao.GenericDAO - save successful
9437 OpenJPAPU TRACE [main] openjpa.jdbc.SQL - <t 8604923, conn 3346361> executing prepstmnt 10340902 SELECT VALUE_COLUMN FROM generator_table WHERE ID_COLUMN = ? FOR UPDATE [params=(String) Gen_ID]
9484 OpenJPAPU TRACE [main] openjpa.jdbc.SQL - <t 8604923, conn 3346361> [47 ms] spent
9484 OpenJPAPU TRACE [main] openjpa.jdbc.SQL - <t 8604923, conn 3346361> executing prepstmnt 6529454 UPDATE generator_table SET VALUE_COLUMN = ? WHERE ID_COLUMN = ? AND VALUE_COLUMN = ? [params=(long) 29, (String) Gen_ID, (long) 28]
9531 OpenJPAPU TRACE [main] openjpa.jdbc.SQL - <t 8604923, conn 3346361> [47 ms] spent
9625 OpenJPAPU TRACE [main] openjpa.jdbc.SQL - <t 8604923, conn 10279131> executing prepstmnt 22844058 INSERT INTO generator (id) VALUES (?) [params=(long) 28]
9640 OpenJPAPU TRACE [main] openjpa.jdbc.SQL - <t 8604923, conn 10279131> [15 ms] spent
8625 [main] INFO com.javaeye.jpa.interceptor.AuditLogger - interceptor after persist Generator
8625 [main] INFO com.javaeye.jpa.domain.Generator - after persist Generator


可以在persistence.xml文件中为persistence unit中的每一个entity class指定一组默认监听器,如果某个entity不想使用默认监听器,可以使用@ExcludeDefaultListeners来取消。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值