与实体经理无关的例外情况

时间:2014-03-07 09:46:24

标签: exception-handling ejb entitymanager rollback

我的EJB中有一个实体管理器

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

我填充一个对象,然后我在我的数据库中提交它,但是如果我有一个例外,对于重复的ID,我无法抓住它,我不知道为什么。

    try{
      em.merge(boelLog);
    } catch (Exception e){
        System.out.println("Generic Exception");
    }

1 个答案:

答案 0 :(得分:1)

JPA使用事务将实体修改发送到数据库。您可以通过Bean管理事务(BMT)手动指定这些事务,或让应用程序服务器为您执行(容器管理事务;默认值)。

因此,您需要在事务结束时捕获异常,而不是在调用merge()类的persist()EntityManager方法之后。在您的情况下,当您从最后一个EJB对象返回时,事务可能会结束。

容器管理事务的示例(默认值):

 @Stateless
 public class OneEjbClass {
      @Inject
      private MyPersistenceEJB persistenceEJB;

      public void someMethod() {
           try {
                persistenceEJB.persistAnEntity();
           } catch(PersistenceException e) {
                // here you can catch persistence exceptions!
           }
      }
 }

 ...

 @Stateless
 public class MyPersistenceEJB {
      // this annotation forces application server to create a new  
      // transaction when calling this method, and to commit all 
      // modifications at the end of it!
      @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
      public void persistAnEntity() {
            // merge stuff with EntityManager
      }
 }

可以指定方法调用(或EJB对象的任何方法调用)必须,可以或不能创建新事务的时间。这是通过@TransactionAttribute注释完成的。默认情况下,EJB的每个方法都配置为REQUIRED(与指定@TransactionAttribute(TransactionAttributeType.REQUIRED)相同),它告诉应用程序重用(继续)调用该方法时处于活动状态的事务,并创建一个如果需要,可以进行新的交易。

有关此处交易的详情:http://docs.oracle.com/javaee/7/tutorial/doc/transactions.htm#BNCIH

有关JPA和JTA的更多信息,请访问:http://en.wikibooks.org/wiki/Java_Persistence/Transactions