事件监听是JDK中常见的一种模式。 Hibernate中的事件监听机制可以对Session对象的动作进行监听,一旦发生了特殊的事件,Hibernate就会调用监听器类中的事件处理方法。在某些功能的设计中,既可以使用Hibernate的拦截器实现,也可以使用Hibernate的事件监听来实现。
Hibernate 定义了多个事件涵盖了持久化过程中的不同生命同期,即Session对象中的第一个方法均分别对应事件。调用某个方法时就会触发相应的事件,并被预先设置的监听器收到及处理。
Hibernate中事件监听器接口均在org.hibernate.event包中,事件与监听器接口对应关系如下:
事件类型 对应的监听器接口
auto-flush AutoFlushEventListener
merge MergeEventListener
delete DeleteEventListener
persist PersistEventListener
dirty-check DirtyCheckEventListener
evict EvictEventListener
flush FlushEventListener
flush-entity FlushEntityEventListener
load LoadEventListener
load-collection LoadCollectionEventListener
lock LockEventListener
refresh RefreshEventListener
replicate ReplicateEventListener
save-update SaveUpdateEventListener
pre-load PreLoadEventListener
pre-update PreUpdateEventListener
pre-delete PreDeleteEventListener
pre-insert PreInsertEventListener
post-load PostLoadEventListener
post-update PostUpdateEventListener
post-delete PostDeleteEventListener
post-insert PostInsertEventListener
注意:pre和post表示事件发生之前和之后。
Hibernate 事件监听的使用方法如下:
1、用户定制事件监听器首先需要与要处理事件相对应的接口,或者继承实现这个接口的类,然后通过 Hibernate的配置(hibernate.cfg.xml)配置事件监听器对象。如:
public class LogPostLoadEventListener implements PostLoadEventListener{
public void onPostLoad(PostLoadEvent event){
……
…
……
}
}
在Hibernate的配置文件中使用标签添加事件监听器功能:
然而,也可以通过编程方式加载事件监听器对象:
Configuration cfg = new Configuration();
cfg.setListener("post-load",new LogPostLoadEventListener());
cfg.configure();
实现的代码如下:
public interface Auditable {
}
public class AuditLog implements Serializable {
private Integer id;
private String entityName;
private String entityId;
private Date createTime;
private String operationType;
…
}
public class Product implements Serializable ,Auditable{
private String id;
private String name;
private Double price;
private String description;
…
}
public enum OperationType {
LoAD,CREATE,UPDATE,DELETE
}
配置文件如下:
class="com.kkoolerter.hibernate.listener.AuditLogEventListener" />
<listener type="post-update" p="" <="">
class="com.kkoolerter.hibernate.listener.AuditLogEventListener" />
<listener type="post-delete" p="" <="">
class="com.kkoolerter.hibernate.listener.AuditLogEventListener" />