用户登录
用户注册

分享至

hibernate 事件监听器

  • 作者: 用不着的爱
  • 来源: 51数据库
  • 2021-01-30
首先定义一个mark接口Historiazable,实现该接口的entity类表明是需要做审计日志的。
然后编写我们自定义的EventListener类,实现上述的事件接口。
在事件接口实现方法里在根据不同的事件编写审计日志的代码。
Java代码
public class HistoryListener implements PostInsertEventListener,
PostUpdateEventListener, PostDeleteEventListener {

@Override
public void onPostInsert(PostInsertEvent event) {
if (event.getEntity() instanceof Historizable) {
// 保存插入日志
}
}

@Override
public void onPostUpdate(PostUpdateEvent event) {
if (event.getEntity() instanceof Historizable) {
// 保存修改日志
}
}

@Override
public void onPostDelete(PostDeleteEvent event) {
if (event.getEntity() instanceof Historizable) {
// 保存删除日志
}
}
}

配置EventListener
编辑hibernate.cfg.xml,配置监听器
Xml代码
<session-factory>
<listener type="post-insert" class="net.jeffrey.hibernate.history.HistoryListener"/>
<listener type="post-update" class="net.jeffrey.hibernate.history.HistoryListener"/>
<listener type="post-delete" class="net.jeffrey.hibernate.history.HistoryListener"/>
</session-factory>

配置持久化单元
在persistence.xml中加入
<property name="hibernate.ejb.cfgfile" value="hibernate.cfg.xml"/>



  能够取得运行期详细信息,除了能记录粗粒度的实体的保存删除操作外,还能精确追踪对实体字段修改、实体关联/级联关系的变更,能记录更新前的值、更新后的值,可以生成详细日志。
灵活解耦,跨数据库,不影响原有代码。
hibernate3 新特性事件处理框架是hibernate 2拦截器的一个补充或者替代,由拦截器被动拦截操作事件变成事件源的主动驱动,这是一个进步。hibernate 事件框架官方文档.
hibernate3中定义了很多的事件,涵盖了持久化过程中不同的生命周期。简单说session的一个方法(load, flush...)分别对应一个事件,当该方法被调用时,就会触发一个相应的事件,这个事件会被我们预先定义的事件监听器收到,再进行相应的处理。这种方式来做审计日志是再适合不过。
但也有个缺点就是这样的event-listener是脱离主容器(比如spring ioc环境)单独实例化的,无法访问主容器的资源(比如要取得当前登录的用户信息就会比较麻烦)。这个暂时还没解决。

在这里我们选取postinserteventlistener(插入后事件),postupdateeventlistener(更新后事件),postdeleteeventlistener(删除后事件)接口作为crud方法的监听接口。hibernate3中事件是分为pre和 post,表示该发生事件前、后。这里我们全部用post,因为postevent只有在数据实际改变后才会触发,假如crud事务因为异常回滚,则不会触发事件。

首先定义一个mark接口historiazable,实现该接口的entity类表明是需要做审计日志的。
然后编写我们自定义的eventlistener类,实现上述的事件接口。
在事件接口实现方法里在根据不同的事件编写审计日志的代码。
java代码
public class historylistener implements postinserteventlistener,
postupdateeventlistener, postdeleteeventlistener {

@override
public void onpostinsert(postinsertevent event) {
if (event.getentity() instanceof historizable) {
// 保存插入日志
}
}

@override
public void onpostupdate(postupdateevent event) {
if (event.getentity() instanceof historizable) {
// 保存修改日志
}
}

@override
public void onpostdelete(postdeleteevent event) {
if (event.getentity() instanceof historizable) {
// 保存删除日志
}
}
}

配置eventlistener
编辑hibernate.cfg.xml,配置监听器
xml代码






配置持久化单元
在persistence.xml中加入
软件
前端设计
程序设计
Java相关