想通过hibernate3中的监听器来完成表更新前和更新后的内容记录,用的是JPA的@PreUpdate注解方式,可以获得实体,但在更新前获得的实体,在hibernate中的session中实体已经改变了,所以获得实体是改了之后的,怎么得到更改之前的呢?用PostUpdateEventListener中的getOldState方法可以得到,但是PostUpdateEventListener监听器在JPA中不会配,怎么都不监控,求给个思路,万分感谢。
实现了,结贴了,具体看我的博客,希望可以帮助同样遭遇的人。
Hibernate3 新特性事件处理框架是hibernate 2拦截器的一个补充或者替代,由拦截器被动拦截操作事件变成事件源的主动驱动,这是一个进步。Hibernate 事件框架官方文档.
Hibernate3中定义了很多的事件,涵盖了持久化过程中不同的生命周期。简单说Session的一个方法(load, flush...)分别对应一个事件,当该方法被调用时,就会触发一个相应的事件,这个事件会被我们预先定义的事件监听器收到,再进行相应的处理。这种方式来做审计日志是再适合不过。
但也有个缺点就是这样的Event-listener是脱离主容器(比如Spring IoC环境)单独实例化的,无法访问主容器的资源(比如要取得当前登录的用户信息就会比较麻烦)。这个暂时还没解决。
在这里我们选取PostInsertEventListener(插入后事件),PostUpdateEventListener(更新后事件),PostDeleteEventListener(删除后事件)接口作为CRUD方法的监听接口。hibernate3中事件是分为pre和post,表示该发生事件前、后。这里我们全部用Post,因为PostEvent只有在数据实际改变后才会触发,假如CRUD事务因为异常回滚,则不会触发事件。