我的EJB中有一个实体管理器
@PersistenceContext(unitName = "cnsbEntities")
private EntityManager em;
我填充一个对象,然后我在我的数据库中提交它,但是如果我有一个例外,对于重复的ID,我无法抓住它,我不知道为什么。
try{
em.merge(boelLog);
} catch (Exception e){
System.out.println("Generic Exception");
}
答案 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