JPA Container托管事务 - 如何更新同一事务中的多个实体

时间:2014-05-28 12:58:02

标签: java hibernate jpa transactions

我还是JPA的新手以及实体经理的工作方式。我有一个配置了容器管理事务的应用程序,我试图弄清楚如何在单个事务中持久化多个对象。以下是我首先尝试的内容:

@Stateless
public class UserManager{
 @PersistenceContext(unitname="dataPortal")
 EntityManager em;

 public void insertUser(User user)
 {
  em.getTransaction().begin();
  ChangeEvent event = new ChangeEvent("user created");
  em.persist(u);
  em.persist(event);
  em.getTransaction().commit();
 }

}

当我尝试获取事务时,这会抛出非法状态异常。我通过阅读发现,当集装箱管理时,你不应该触摸交易。

我想要做的是确保User和ChangeEvent对象在同一个事务中保持不变。如何使用容器管理的事务强制执行该操作?

1 个答案:

答案 0 :(得分:0)

就像您已经说过的那样,交易由容器管理。

如果您希望UserChangeEvent同时保留在同一个事务中,只需按以下方式注释您的方法:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@TransactionManagement(TransactionManagementType.CONTAINER) 
public void insertUser(User user)
     {
      ChangeEvent event = new ChangeEvent("user created");
      em.persist(u);
      em.persist(event);
     }

这应该可以解决问题。如果您还有其他问题,请随时提出。