【问题标题】:JPA Container managed transactions - how to update multiple entities in the same transactionJPA Container managed transactions - 如何在同一个事务中更新多个实体
【发布时间】:2014-05-28 12:58:02
【问题描述】:

我对 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 对象保留在同一个事务中。我如何通过容器管理的事务来强制执行?

【问题讨论】:

  • 我注意到您想在更新或创建实体时添加事件。看看 CDI Events 或 @Stereotypes。它将帮助您避免将所有样板代码放在您的 bean 中

标签: java hibernate jpa transactions


【解决方案1】:

正如您已经说过的,事务由容器管理。

如果您希望 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);
     }

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2017-06-15
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多