我一直认为在事务之前(在entityManager.getTransaction().begin()
之前)获取的实体与持久化上下文分离(同时使用相同的实体管理器来获取实体来处理交易)。事实上,每次我管理事务时,我都必须显式合并从事务外部获取的实体。如果我不这样做,更新就不会反射(reflect)在数据库中。
但最近,我和一位同事进行了讨论,他以相反的方式经历了这种情况。他必须显式分离在事务之前获取的每个实体,以避免更新数据库。
我们代码之间的唯一区别是我的 persistence.xml
文件是 2.0 版本,而他的是 1.0 版本。但他在代码中使用 JPA 2.1。这是这种奇怪行为的原因还是我在这里遗漏了什么?
我们都使用 Hibernate 作为实现。
最佳答案
PersistenceContext 可能有两个范围:
- 交易范围
- 扩展范围
交易范围
仅当 EntityManager 是容器管理时才会发生。在这种情况下,只要当前事务存在,当前的 PersistenceContext 就处于 Activity 状态。
扩展范围
当 EntityManager 是应用程序管理(默认)或容器管理(EntityManager 需要注释:@PersistenceContext( type=PersistenceContextType.EXTENDED)
)时发生。
长话短说:EXTENDED-SCOPE 意味着当前 PersistenceContext 的生命周期与您的 bean 的生命周期一样长。
关于java - 在事务之外获取的实体是受管理的还是分离的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32719429/