2

我的应用程序使用 Hibernate 作为 JPA 提供者,使用 JBOSS 6.1.0-final 作为服务器。事务是 CMT(我的 persistence.xml 中的事务类型是 JTA)。正如大多数教程所建议的那样。如果 ejb 方法中的事务没有任何异常结束,它将自动提交。但是,在我的应用程序中,除非我使用flush(),否则当 ejb 方法成功结束时不会提交事务(例如,插入记录永远不会将任何数据推送到数据库)。无状态和有状态 bean 的结果相同。

我尝试使用@TransactionAttribute(TransactionAttributeType.REQUIRED),但结果也是一样的。即使使用MANDATORY注释也不会引发任何异常,这表明我的 ejb 方法正在使用容器管理的事务。

代码片段:

 @Stateful
 @Local
 public class TransactionTest implements ITransactionTest {

   @PersistenceContext(unitName="Table")
   private EntityManager manager;

   public void generateRecord(int i) throws RuntimeException{
     Record record = new Record();
     record.setId(i+"");
     record.setStatus(1);
     manager.persist(record);
     manager.flush();  //without this, it won't commit
  }
}

那么,为什么我的 ejb 方法不能自动提交事务呢?

4

1 回答 1

1

有状态会话 beanPersistenceContextType.EXTENDED默认具有。

5.6.1.2 容器管理的扩展持久性上下文

容器管理的扩展持久性上下文从通过依赖注入或通过 JNDI 查找获得容器管理的实体管理器的点开始存在,直到它被容器关闭。这种扩展的持久性上下文只能在有状态会话 bean 的范围内启动,并在有状态会话 bean 的 @Remove 方法完成时由容器关闭(或有状态会话 bean 实例以其他方式被销毁)。

当使用扩展的持久性上下文时,由 EntityManager 管理的实体保持独立于 JTA 事务是否开始或提交。在持久性上下文结束之前,它们不会分离。

  • 您可以尝试TransactionAttributeType.REQUIRES_NEW,因此在退出该方法后会调用 commit。在提交之前会自动调用 Flush。

    如果您想立即提交更改,您可以尝试更改事务属性,该属性将成为单独的新事务的一部分。

  • 如果您不想提交更改并且需要单个事务来传播,那么您当前的方法很好并明确调用刷新。

于 2013-04-13T13:22:51.053 回答