【问题标题】:State of jpa managed entity in surrounding transaction周边事务中 jpa 管理实体的状态
【发布时间】:2014-04-20 19:44:00
【问题描述】:

JPA 2.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)是否将返回的实体视为托管或分离的?

一个密切相关的问题: (再次伪代码)

@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);
   }
}

第二个示例显示了托管实体如何从周围事务移交给嵌套事务。然后将实体合并到嵌套事务的 PC 中并进行更改。在 java 中,我们在处理对象时使用引用,因此所有更改都将由 em1 和 em2 通知。在“changeEntity(e)”结束时,嵌套事务被提交。

问题:如果周围事务提交,会不会出现 OptimisticLock 异常,还是修改后的版本传播到 em1?如果版本字段暴露给实体(通过使用@Version 注释字段),行为会有所不同吗?

【问题讨论】:

  • 当您在自己的环境中尝试此操作时会发生什么?

标签: java jpa transactions entitymanager


【解决方案1】:

Q1 周围事务的 EntityManager(这里是 em1)是否将返回的实体视为托管或分离的?

A1 em1 不知道返回的实体。将实体视为分离的。


Q2如果周围事务提交,会不会出现OptimisticLock异常,还是修改后的版本传播到em1?

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


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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2018-10-24
    相关资源
    最近更新 更多