在Hibernate中查询事件监听器内部的最佳实践

时间:2014-08-19 20:42:11

标签: java hibernate listener hibernate-session

我们有一个FlushEventListener来执行审计功能。在更新某个实体时,hibernate会在刷新之前回调我们的审计代码。审计代码需要查询数据库。

如果我们尝试在同一个会话中执行它,显然我们搞乱了会话的状态:我们从hibernate内部获得NullPointerException,在某个时候它在一个名为NaturalIdXrefDelegate的类中验证naturalIds。

我们目前通过为审计查询打开一个新会话来解决它。这样做的问题是我们失去了getCurrentSession(由hibernate管理的整个请求的会话)的好处。这样我们就可以回到每个查询打开一个会话。

是否有一个优雅的解决方案,或者我们基本上需要重新实现getCurrentSession来管理我们在请求中的会话#2?

1 个答案:

答案 0 :(得分:0)

您无需打开新会话。这足以暂时禁用刷新。

Session session = entityManager.unwrap(Session.class);
session.setHibernateFlushMode(FlushMode.MANUAL);
// do your db stuff
session.setHibernateFlushMode(FlushMode.AUTO);

它实际上比

快很多
session.getSessionFactory().openSession()

哪个适用于顺便说一句。