我们有一个FlushEventListener来执行审计功能。在更新某个实体时,hibernate会在刷新之前回调我们的审计代码。审计代码需要查询数据库。
如果我们尝试在同一个会话中执行它,显然我们搞乱了会话的状态:我们从hibernate内部获得NullPointerException,在某个时候它在一个名为NaturalIdXrefDelegate的类中验证naturalIds。
我们目前通过为审计查询打开一个新会话来解决它。这样做的问题是我们失去了getCurrentSession(由hibernate管理的整个请求的会话)的好处。这样我们就可以回到每个查询打开一个会话。
是否有一个优雅的解决方案,或者我们基本上需要重新实现getCurrentSession来管理我们在请求中的会话#2?
答案 0 :(得分:0)
您无需打开新会话。这足以暂时禁用刷新。
Session session = entityManager.unwrap(Session.class);
session.setHibernateFlushMode(FlushMode.MANUAL);
// do your db stuff
session.setHibernateFlushMode(FlushMode.AUTO);
它实际上比
快很多session.getSessionFactory().openSession()
哪个适用于顺便说一句。