如何判断当前会话是否脏?
当且仅当数据库发生更改时,我想发布一个事件。我在 @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;
}
根据这里的答案/sf/answers/368803221/我希望它能够工作并返回 true。
我错过了什么?
更新
考虑到@fladdimir 的回答,虽然这个函数是在事务上下文中调用的,但我确实@Transactional在函数上添加了(来自 org.springframework.transaction.annotation)。但我仍然遇到相同的行为。isDirty 返回 false。
此外,正如预期的那样,当程序在session.isDirty().
UPDATE_2
我还尝试在调用 repo save 之前更改会话刷新模式,也没有任何影响:
session.setFlushMode(FlushModeType.COMMIT);
session.setHibernateFlushMode(FlushMode.MANUAL);