[英]Are entities fetched outside transaction managed or detached?
我一直认为,在事务处理之前(在entityManager.getTransaction().begin()
)获取的实体与持久性上下文分离(同时使用相同的实体管理器来获取处理事务的实体)。 实际上,每次我管理事务时,我都必须显式合并从其外部获取的实体。 如果没有,更新将不会反映在数据库中。
但是最近,我和一位经历相反情况的同事进行了讨论。 他必须明确分离事务之前获取的每个实体,以避免更新数据库。
我们的代码之间的唯一区别是,我的persistence.xml
文件是2.0版,而他的文件是1.0版。 但是他在代码中使用的是JPA 2.1。 是这种奇怪行为的原因,还是我在这里缺少什么?
我们都使用Hibernate作为实现。
PersistenceContext可能有两个作用域:
交易范围
仅在EntityManager由容器管理时发生。 在这种情况下,只要存在当前事务,就可以激活当前PersistenceContext。
扩展范围
在EntityManager由应用程序管理(默认)或容器管理(EntityManager需要注释: @PersistenceContext( type=PersistenceContextType.EXTENDED)
)时发生。
长话短说:EXTENDED-SCOPE表示当前的PersistenceContext生存时间与您的bean生存时间一样长。
事物是否以及如何自动融合到交易环境中取决于几个因素。 使用的JPA实现,持久性上下文范围以及使用的事务隔离。 如果不看整个环境,就很难回答。 我假设您的应用程序允许非事务性读取(脏读取,幻像读取,不可重复读取),因此您被“允许”决定是否要合并。 另一个解释可能是您的应用程序代码混合了多个持久性上下文,因此需要您将在一个持久性上下文中读取的实体合并到另一个持久性上下文(开始TX的上下文)中。
他们将得到管理。 任何更改将在下一次flush
反映到数据库。 事务提交以及事务前操作排队的更改会立即被刷新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.