如果我坚持分离后,为什么无法找到实体

时间:2011-10-04 16:46:45

标签: java-ee jpa-2.0 eclipselink

我有无状态会话Bean和容器管理事务。我想在数据库中创建(持久化)后返回非托管实体。这就是我的方式:

@Stateless
public class MyBean {

   @EJB(name="MyController")
   private MyController myController;

   public MyEntity create(MyEntity entity) {
      //...
      myController.create(entity);
      myController.preTransfer(entity);
      return entity;
   }
}
@Stateless
public class MyController {

   @PersistenceContext(unitName = "myPU")
   private EntityManager em;

   public void create(MyEntity entity) {
      //...
      em.persist(entity);
   }

   public void preTransfer(MyEntity entity) {
       if (em.contains(entity)) {
           em.detach(entity);
       }
       //...
   }
}

我调用 MyBean.create ,实体成功保留, MyBean.create 返回非托管实体,没关系。但下次当我尝试通过id检索此实体时,无法找到它。如果我发表评论 detach ,则可以找到实体,但 MyBean.create 在这种情况下返回管理实体。哪里错了?

2 个答案:

答案 0 :(得分:2)

EntityManager.detach状态的javadoc:

  

对实体进行的未刷新更改(如果有)(包括删除   实体),不会同步到数据库

所以你坚持下去,然后分开它。但是与persist相关的操作尚未刷新,因此实体不会保存到数据库中。

你为什么要分开它?一旦交易结束,它将自动分离。

答案 1 :(得分:0)

修改JB的答案:您也可以使用干净的标准机制,而不必强制容器分离或明确刷新:

@Stateless
public class MyController {

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public MyEntity create(MyEntity entity) {
       //...
       em.persist(entity);
       return entity;
    }
}

结果你会得到一个分离的实体。