2

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

如果我们尝试在同一个会话中执行此操作,显然我们会弄乱会话的状态:我们从 hibernate 内部得到一个 NullPointerException,在某个时刻,当它在名为 NaturalIdXrefDelegate 的类中验证 naturalIds 时。

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

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

4

1 回答 1

0

您不必打开新会话。暂时禁用刷新就足够了。

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

它实际上比

session.getSessionFactory().openSession()

顺便说一句,这很有效。

于 2018-04-08T22:20:39.483 回答