Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 周围事务中jpa托管实体的状态_Java_Jpa_Transactions_Entitymanager - Fatal编程技术网

Java 周围事务中jpa托管实体的状态

Java 周围事务中jpa托管实体的状态,java,jpa,transactions,entitymanager,Java,Jpa,Transactions,Entitymanager,JPA2.x,容器管理事务,容器管理依赖注入 伪代码: @Transactional(Required) public class EJB1 { @PersistenceContext EntityManager em1; @Inject EJB2 ejb2; public void callSecondEjb(){ MyEntity e = ejb2.returnEntity(); } } @Transactional(Requires_N

JPA2.x,容器管理事务,容器管理依赖注入

伪代码:

@Transactional(Required)
public class EJB1 {
   @PersistenceContext
   EntityManager em1;

   @Inject
   EJB2 ejb2;

   public void callSecondEjb(){
      MyEntity e = ejb2.returnEntity();
   }
}

@Transactional(Requires_New)
public class EJB2 {
   @PersistenceContext
   EntityManager em2;

   public MyEntity returnEntity(){
      MyEntity e = new MyEntity();
      em2.persist(e);
      return e;
   }
}
(上面的代码是伪代码。请不要挑剔打字错误或其他东西。)

其思想是,在嵌套事务中创建并持久化实体。据我所知,每个事务都有自己的EntityManager我的问题:周围事务的EntityManager(此处为em1)是否将返回的实体视为托管实体或分离实体

一个密切相关的问题: (还是伪代码)

第二个示例显示了如何将托管实体从源事务移交给嵌套事务。实体随后合并到嵌套事务的PC中并进行更改。在java中,我们在处理对象时使用引用,所以所有的更改都会被em1和em2注意到。在“changeEntity(e)”的末尾提交嵌套事务


问题:如果周围事务提交,是否会出现OptimisticLock异常,或者更改后的版本是否会传播到em1?如果版本字段向实体公开(通过用@version注释字段),行为是否会有所不同?

Q1周围事务的实体管理者(此处为em1)是否将返回的实体视为已管理或已分离

A1em1不知道返回的实体。将实体视为已分离


Q2如果周围事务提交,是否会出现OptimisticLock异常,或者更改的版本是否会传播到em1

A2也不例外。由于“引用调用”,em1似乎知道所有更改


Q2b如果版本字段暴露给实体(通过用@version注释字段),行为是否会有所不同


A2b不知道。我的示例暴露了version字段。

当您自己在您的环境中尝试时会发生什么?
@Transactional(Required)
public class EJB1 {
   @PersistenceContext
   EntityManager em1;

   @Inject
   EJB2 ejb2;

   public void callSecondEjb(){
      MyEntity e = new MyEntity();
      em1.persist(e);
      ejb2.changeEntity(e);
      e.setOtherValue(123);
   }
}

@Transactional(Requires_New)
public class EJB2 {
   @PersistenceContext
   EntityManager em2;

   public MyEntity changeEntity(MyEntity e){

      em2.merge(e);
      e.setValue(13);
   }
}