我将Envers添加到我的项目中,审计表正在更新实体创建/更新事务。完美!!
现在我希望以异步方式执行审计表更新事务。我想要实现的是 - 即使审计事务失败,也不应回滚主事务。
如果有人试过这个,请提供一些提示。
答案 0 :(得分:1)
开箱即用,根本不可能。 Envers挂钩到默认的Hibernate事件系统,以同步方式触发所有侦听器。
从逻辑上讲,标记要审计的实体并将其状态保持为历史变更记录并允许实体进行更改(无论其是否具有历史记录)是没有意义的。改变是否有效。这比整体设计或部署问题更能说明问题。
我想说如何集成Envers和Hibernate,如果你需要异步,不可靠的审计,那么你可能需要编写自己的解决方案。
答案 1 :(得分:0)
您可以为版本3提供AuditEventListener。在v4之后,每个事件类型都有不同的类,因此您必须为每个事件类型设置一个类(org.hibernate.envers.event.EnversPostInsertEventListenerImpl等),但除此之外没什么不同。
以下是版本3的代码如何:
public class MyEventListener extends org.hibernate.envers.event.AuditEventListener {
ExecutorService executorService = Executors.newSingleThreadExecutor();
@Override
public void onPostInsert(PostInsertEvent event) {
super.onPostInsert(event);
}
@Override
public void onPostUpdate(final PostUpdateEvent event) {
Runnable runIt = new Runnable() {
public void run() {
System.out.println("Running in a thread now");
MyEventListener.super.onPostUpdate(event);
System.out.println("Finished OnPostUpdate THREAD!!!!");
}
};
executorService.submit(runIt);
System.out.println("Finished OnPostUpdate call");
}
@Override
public void onPostDelete(PostDeleteEvent event) {
super.onPostDelete(event);
}
@Override
public void onPreUpdateCollection(PreCollectionUpdateEvent event) {
super.onPreUpdateCollection(event);
}
@Override
public void onPreRemoveCollection(PreCollectionRemoveEvent event) {
super.onPreRemoveCollection(event);
}
@Override
public void onPostRecreateCollection(PostCollectionRecreateEvent event) {
super.onPostRecreateCollection(event);
}
}