Spring Hibernate异常处理

时间:2012-06-12 14:38:51

标签: spring hibernate jta

在Spring + Hibernate + JTA项目中,我试图让异常处理工作。对于以下代码:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public HandsetManufacturer createHandsetManufacturer(
        HandsetManufacturer handsetManufacturer)
        throws HandsetManufacturerAlreadyExistsException{
    HandsetManufacturer handsetManufacturer2=new  HandsetManufacturer();
    try {

            handsetManufacturerDao.findByUniqueProperty(
                HandsetManufacturer.class, NAME_PROPERTY,
                handsetManufacturer.getName());
        throw new HandsetManufacturerAlreadyExistsException();
    } catch (BusinessObjectNotFoundException ignoreMe) {
    }
    //handsetManufacturer2= handsetManufacturerDao.create(handsetManufacturer);

    try{
        handsetManufacturer2= handsetManufacturerDao.create(handsetManufacturer);
    }catch (JDBCException e) {
        System.out.println("::HibernateException::"+e.getSQL());
        System.out.println("::HibernateException::"+e.getErrorCode());
        System.out.println("::HibernateException::"+e.getSQLState());
        System.out.println("::HibernateException::"+e.getSQLException());
        System.out.println("::HibernateException::"+e.getMessage());
        System.out.println("::HibernateException::"+e.getCause());
        throw new TechnicalException(e);
    }

    return handsetManufacturer2;
}

我试图捕获底层的hibernate / jdbc / db异常(例如,当依赖实体仍然存在时,删除将因org.springframework.orm.hibernate3.HibernateJdbcException而失败)并执行一些操作。但是永远不会达到捕获代码。

但如果我删除" @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT)"从我的方法它将达到阻止块。 我想这与Spring管理它的方式有关,但我不知道如何在JDBCException期间捕获异常并使用@Transaction注释

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我猜你的DAO也配置为具有REQUIRED传播的事务。在Hibernate中,有很多操作被延迟,直到会话被刷新。刷新将发生的时间之一是在事务提交之前。这意味着如果您的方法(我猜它是某种服务中的方法)是围绕它进行事务处理,Hibernate在您的DAO中保持或保存操作create()实际上不会在完成您的服务方法之前进入DB。

一种解决方法是显式执行Session flush()(您可以考虑放入DAO的create()),这样它就会触发数据库更新,从而导致您希望抛出异常。