【问题标题】:JPA transactions: select right after commit?JPA 事务:提交后立即选择?
【发布时间】:2013-10-01 02:10:19
【问题描述】:

我正在使用带有 EJB/JPA 的 JBoss EAP 6.1.0。我有一个用户对象,其中包含他所属的几个组,我正在尝试使用三步方法在数据库中创建它:

  1. 保存用户
  2. 保存他所属的组
  3. 查询数据库并返回该新用户

我的问题是步骤 (3) 总是返回 null,因为提交尚未发生。在第 2 步和第 3 步之间添加 em.flush() 无济于事。我避免使用 Groups 进行任何 @CASCADE 注释,因此只保存用户并让 Groups 级联不是一种选择。这是示例代码:

@Stateless
public class RegistrationService {

   @EJB
   UserDao userDao;

   public User registerNewUser(User user, List<Group> groups) {
       userDao.saveNewUser(user);
       userDao.saveNewGroupsToUser(user, groups);
       return userDao.findUser(user);
   }
}

这是一个简化的 UserDao:

@Stateless
public class UserDao {

  @PersistenceContext
  private EntityManager em;

  public void saveNewUser(User user) {
    em.persist(user);
  }

  public void saveNewGroupsToUser(User user, List<Group> groups) {
    for (Group group : groups) {
       GroupToUser groupToUser = new GroupToUser(user, group);
       em.persist(groupToUser);
    }

  public User findUser(User user) {
    return em.createQuery("from User where user = :userId")
       .setParameter("userId",user.getUserId())
       .getSingleResult();
  }
}

我发现,如果我用 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 注释 findUser(User) 方法,它会按预期工作。这是为什么?我以为registerNewUser() 创建了一个大事务,然后 findUser() 会创建一个不应该知道保存的嵌套事务?

【问题讨论】:

    标签: java jpa jboss ejb


    【解决方案1】:

    我认为您应该在第 1 步之后(保存用户后)添加 em.flush(),因为它将执行 SQL 以保存新用户。

    第二件事,从代码看来,使用了容器管理的事务。 CMT 不允许嵌套事务。所以基本上添加 REUIRED_NEW 属性可能会强制刷新以前的保存 SQL 查询。确认这一点的一种方法是记录 SQL 查询

    【讨论】:

    • 保存后的 em.flush() 好像没有效果,还是返回null。我会继续调查。
    • 我想我会坚持在findUser() 方法上使用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW),因为这样就可以了。由于我使用的是 CMT,这可能是我能得到的最好的。
    【解决方案2】:

    我最终只是在findUser() 方法上使用了@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)。由于容器管理事务 (CMT) 不允许嵌套事务,这似乎会刷新之前的 SQL 更新/插入语句,从而允许选择按预期工作。

    【讨论】:

      猜你喜欢
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 2016-10-23
      • 1970-01-01
      • 2015-12-28
      • 2017-02-26
      • 1970-01-01
      相关资源
      最近更新 更多