java - 在事务之外获取的实体是受管理的还是分离的?

标签 java jpa

我一直认为在事务之前(在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/

相关文章:

java - 在 Spock 集成测试中模拟 JPA 存储库

java - 来自外部存储的 Uri 上的 MediaPlayer 为 null

java - NetBeans 中的命令行参数

java - 用于获取集合大小的 JPA 命名查询

java - 比较 MySQL 和 Java 时间

java - 使用 SwingWorker 在 GUI 中添加进度条

java - Hibernate返回 "weird"连接

jpa - JPA条件构建器联接图

java - PESSIMISTIC_WRITE 是否锁定了整个表?

java - JPA @OneToOne 具有相同类型