Exception handling 不使用实体管理器处理异常

Exception handling 不使用实体管理器处理异常,exception-handling,ejb,entitymanager,rollback,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")

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

@PersistenceContext(unitName = "cnsbEntities")
private EntityManager em;
我填充一个对象,然后在我的数据库中提交它,但如果我有一个异常,对于重复ID,我无法捕获它,我不知道为什么

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

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

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

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

@无状态
公共类OneEJB类{
@注入
私有MyPersistenceEJB persistenceEJB;
公共方法(){
试一试{
persistenceEJB.persistAnEntity();
}捕获(持久异常e){
//在这里您可以捕获持久性异常!
}
}
}
...
@无国籍
公共类MyPersistenceEJB{
//此注释强制应用程序服务器创建新的
//调用此方法时的事务,并提交所有
//最后的修改!
@TransactionAttribute(TransactionAttributeType.REQUIRES\u NEW)
公共无效持久实体(){
//将内容与EntityManager合并
}
}
可以指定方法调用(或EJB对象的任何方法调用)必须、可以或不能创建新事务的时间。这是通过
@TransactionAttribute
注释完成的。默认情况下,EJB的每个方法都配置为
REQUIRED
(与指定
@TransactionAttribute(TransactionAttributeType.REQUIRED)
)相同),它告诉应用程序重用(继续)调用该方法时处于活动状态的事务,并在需要时创建新事务

有关交易的更多信息,请点击此处:

有关JPA和JTA的更多信息,请参见: