我有一个在Hibernate上运行的JPA应用程序。在我的spring服务类(@Service
)中,我放置了@Transactional
注释。
在某些情况下,我需要暂停或恢复对记录的更改。虽然JPA在默认情况下会在事务结束时自动持久化更改,但我并没有显式触发存储库的save()
命令。
我更喜欢使用EntityManager.detach(Object entity)
来恢复/停止更改。据我所知,这个分离方法应该只恢复给定实体/ DTO对象上的更改。然而,有时候,这种分离方法似乎并不像预期的那样工作,更改仍然被持久保存到数据库中。
然后我发现了一些关于使用EntityManager.clear()方法的建议。我测试了它,它可以恢复/停止更改。
然而,我担心的是,这种EntityManager.clear()
方法是否也会影响其他实体。假设我们有并发事务发生,clear()
会无意中分离所有其他实体吗?如果它真的影响了其他实体,我可以有什么解决办法?
请给我建议。
发布于 2021-10-08 11:02:19
EntityManager.clear()
将分离持久化上下文中的所有实体,丢弃到目前为止在事务中对它们所做的更改。
detach
应该忽略所有尚未刷新到数据库的更改。因此,可能是某个地方发生了刷新,也可能是持久性提供程序实现中的错误。
正如西蒙在评论中指出的那样,回滚似乎是一个更自然的解决方案( clear
也会做几乎相同的w.r.t。挂起的更改)。
https://stackoverflow.com/questions/69490953
复制相似问题