Java 周围事务中jpa托管实体的状态
JPA2.x,容器管理事务,容器管理依赖注入 伪代码: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
@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);
}
}