这是我的代码的一部分。我正在使用JTA事务,这段代码抛出了唯一的约束异常。
@TransactionAttribute( REQUIRED )
private int createProfileHelper(AccountBean accountInfo) throws Exception{
Long portfolio_customer_id = portfolioCustomerEntity.getId();
ExternalAccountEntity externalAccountEntity = new ExternalAccountEntity();
externalAccountEntity.setAccountNumber(accountInfo.getAccountNumber().toUpperCase());
externalAccountEntity.setBrand(brand);
externalAccountEntity.setAccountName(accountInfo.getAccountName());
externalAccountEntity.setRepId(accountInfo.getRepId());
externalAccountEntity.setCreatedBy(userName);
externalAccountEntity.setCreatedDate(new Date());
externalAccountEntity.setUserId(userId);
externalAccountEntity.setCustomerId(portfolio_customer_id); //join created between external account and portfolio_customer
persistenceToolsEntityManager.persist(externalAccountEntity);
}
我写了这段代码来处理异常:
public int createProfile(AccountBean accountInfo){
try{
return createProfileHelper(accountInfo);
}catch(Exception e){
logger.error(e);
logger.error(e.getMessage());
return 0;
}
}
令我惊讶的是,我无法在我的try catch块中捕获异常,尽管我可以在服务器上看到异常闪烁:
Mar 13, 2015 9:19:58 AM org.apache.geronimo.transaction.manager.TransactionImpl beforeCompletion
WARNING: Unexpected exception from beforeCompletion; transaction will roll back
javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-00001: unique constraint (SEC.PORTFOLIO_EXTERNAL_ACCOUNT_U1) violated
答案 0 :(得分:0)
真的不是那么神奇。
您的@TransactionAttribute( REQUIRED )
实际上没有任何效果。此注释只能应用于公共方法,并且仅在从其他bean调用时才具有效果。换句话说,您不能使用注释来划分同一bean中方法调用之间的事务。
事务管理器在退出javax.persistence.PersistenceException
方法(默认情况下具有隐式@TransactionAttribute(REQUIRED))时已捕获createProfile
。
答案 1 :(得分:0)
尝试在persistenceToolsEntityManager.persist
上放置断点并逐行进入代码
您会发现org.apache.geronimo.transaction.manager.TransactionImpl
为您处理例外情况
如果您想在发生任何异常时执行其他操作,请尝试使用TransactionManager
和getStatus()
:)