如何在容器管理的JTA事务中进行异常处理

时间:2015-03-13 13:34:06

标签: java jta tomee

这是我的代码的一部分。我正在使用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

2 个答案:

答案 0 :(得分:0)

真的不是那么神奇。

您的@TransactionAttribute( REQUIRED )实际上没有任何效果。此注释只能应用于公共方法,并且仅在从其他bean调用时才具有效果。换句话说,您不能使用注释来划分同一bean中方法调用之间的事务。

事务管理器在退出javax.persistence.PersistenceException方法(默认情况下具有隐式@TransactionAttribute(REQUIRED))时已捕获createProfile

答案 1 :(得分:0)

尝试在persistenceToolsEntityManager.persist上放置断点并逐行进入代码 您会发现org.apache.geronimo.transaction.manager.TransactionImpl为您处理例外情况 如果您想在发生任何异常时执行其他操作,请尝试使用TransactionManagergetStatus() :)