|
精华帖 (11) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2008-05-10 关键字: jpa, hibernate, 审计日志, 操作历史, 拦截器, 事件驱动, event listener
我们前段时间有个.net项目需要用j2ee改造,有个需求是要对所有的数据库操作(CRUD)都要做历史记录,要记录操作内容,操作的用户和操作时间。这样的需求称为审计日志 Audit log。
Hibernate3 新特性事件处理框架是hibernate 2拦截器的一个补充或者替代,由拦截器被动拦截操作事件变成事件源的主动驱动,这是一个进步。Hibernate 事件框架官方文档. Hibernate3中定义了很多的事件,涵盖了持久化过程中不同的生命周期。简单说Session的一个方法(load, flush...)分别对应一个事件,当该方法被调用时,就会触发一个相应的事件,这个事件会被我们预先定义的事件监听器收到,再进行相应的处理。这种方式来做审计日志是再适合不过。 但也有个缺点就是这样的Event-listener是脱离主容器(比如Spring IoC环境)单独实例化的,无法访问主容器的资源(比如要取得当前登录的用户信息就会比较麻烦)。这个暂时还没解决。 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
<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>
配置持久化单元
在源码根目录里的data.sql是为单元测试准备的基础数据,请在测试前导入到数据库中 源码是Netbeans项目,需要添加Hibernate的依赖和mysql驱动 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2008-05-10
据说Hibernate的拦截器对于SQL SERVER 2005不能拿到具体field的新旧值。不知道事件是不是有相同问题。
|
|
| 返回顶楼 | |
|
时间:2008-05-10
项目中也有类似的需求,使用Hibernate Interceptor,继续关注
|
|
| 返回顶楼 | |
|
时间:2008-05-15
我也碰到奇怪的问题,照说postXxx应该是执行之后才会被调用,但是实际上我debug代码执行到里面了,去看数据库里是没有加进去数据的,不知道为什么~~
|
|
| 返回顶楼 | |
|
时间:2008-05-27
我就喜欢看demo.hehe
|
|
| 返回顶楼 | |
|
时间:2008-05-27
郁闷哦。我用的是myeclipse,包都加上了,提示有问题
net.jeffrey.hibernate.history里面的HistoryListener.java onPostInsert onPostUpdate onPostDelete 这三个方法有相同的错误: The method onPostInsert(PostInsertEvent) of type HistoryListener must override a superclass method 把@Override删掉就好了。这是为什么? |
|
| 返回顶楼 | |
|
时间:2008-05-27
原生的Hibernate Interceptor
优点:可以在hibernate对象操作的时候获取最为详细的运行期信息,字段名,原始值,修改后值等等。 缺点:在JPA API的封装下很难获取到hibernate的session,不能进行持久化操作。 这点不是很明白,LZ能谈详细些吗? |
|
| 返回顶楼 | |
|
时间:2008-05-28
guoxu1231 写道 原生的Hibernate Interceptor
优点:可以在hibernate对象操作的时候获取最为详细的运行期信息,字段名,原始值,修改后值等等。 缺点:在JPA API的封装下很难获取到hibernate的session,不能进行持久化操作。 这点不是很明白,LZ能谈详细些吗? JPA是一个规范,Hibernate有对于JPA的实现,如果采用JPA的API,也就是EntityManager来管理EB(EntityBean),自然就不能获取到底层Hibernate的信息,因为都被封装了嘛。如果不用EntityManager而用Hibernate的API来持久化就没有这个问题。 |
|
| 返回顶楼 | |
浏览 1138 次









