我实现了一个Hibernate的事件监听器,像这样:Hibernate的事件监听器 - 回滚
public class AuditListener implements PostInsertEventListener {
private static final long serialVersionUID = -966368101369878522L;
@Override
public void onPostInsert(PostInsertEvent event) {
if (event.getEntity() instanceof Auditable) {
StatelessSession session = null;
try {
session = event.getPersister().getFactory().openStatelessSession();
Auditable auditableEntity = (Auditable)event.getEntity();
session.beginTransaction();
session.insert(new AuditTrail(auditableEntity.getClass().getSimpleName(),
auditableEntity.getId(), auditableEntity.getStatus(),
auditableEntity.getLastModified()));
session.getTransaction().commit();
} catch (HibernateException he) {
System.out.println("Horrible error: " + he.getMessage());
session.getTransaction().rollback();
} finally {
if (session != null) {
session.close();
}
}
}
}
}
它所做的就是将任何Auditable
对象后立即插入一个AuditTrail
对象到数据库中。
我遇到的问题是在交易过程中有任何异常情况持续存在Auditable
对象时:事务回滚,但仍插入AuditTrail
记录。
我试图把这样的:
StatelessSession session = event.getPersister().getFactory().openStatelessSession();
进入这个:
Session session = event.getSession();
但是,当我尝试使用它会导致该消息在Session is closed
结束的堆栈跟踪。
问题似乎是事件在事务中间触发,在导致回滚的异常情况之前触发,并且由于事件侦听器必须使用自己的会话,所以它也不会回滚。
有什么方法可以确保事件监听器的操作也被回滚?我刚刚选择了事务发生得太早的事件吗?是否有一个事件我应该捕捉发生回滚的最后一个点后发生的事件,从而确保在发生回滚时不会触发插入AuditTrail
?
查看jboss envers,它是用于审计跟踪的。 – ewernli