【发布时间】:2021-08-09 15:39:22
【问题描述】:
当且仅当数据库发生更改时,我想发布一个事件。我在 @Transaction 下运行是 Spring 上下文,我想出了这个检查:
Session session = entityManager.unwrap(Session.class);
session.isDirty();
对于新的(瞬态)对象,这似乎失败了:
@Transactional
public Entity save(Entity newEntity) {
Entity entity = entityRepository.save(newEntity);
Session session = entityManager.unwrap(Session.class);
session.isDirty(); // <-- returns `false` ):
return entity;
}
根据https://stackoverflow.com/a/5268617/672689 此处的答案,我希望它能够工作并返回 true。
我错过了什么?
更新
考虑到@fladdimir 的回答,虽然这个函数是在事务上下文中调用的,但我确实在函数上添加了@Transactional(来自 org.springframework.transaction.annotation)。但我仍然遇到同样的行为。 isDirty 返回 false。
此外,正如预期的那样,当程序在session.isDirty() 行的断点处暂停时,新实体不会显示在数据库上。
UPDATE_2
我还尝试在调用 repo 保存之前更改会话刷新模式,也没有任何效果:
session.setFlushMode(FlushModeType.COMMIT);
session.setHibernateFlushMode(FlushMode.MANUAL);
【问题讨论】:
-
你使用什么休眠版本?您是否尝试过使用普通的休眠应用程序?
-
使用 org.springframework.boot:spring-boot-starter-data-jpa 版本 2.3.3.RELEASE
-
如果您查看
SessionImpl中该方法的实现,您应该会看到插入已被覆盖,所以您的插入可能已经被刷新了? -
@Christian Beikov - 我知道,这就是上周让我发疯的原因......
-
指令
entityRepository.save(newEntity)中的newEntity从何而来?
标签: java hibernate spring-mvc jpa