在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注释
感谢任何帮助!
答案 0 :(得分:0)
我猜你的DAO也配置为具有REQUIRED传播的事务。在Hibernate中,有很多操作被延迟,直到会话被刷新。刷新将发生的时间之一是在事务提交之前。这意味着如果您的方法(我猜它是某种服务中的方法)是围绕它进行事务处理,Hibernate在您的DAO中保持或保存操作create()实际上不会在完成您的服务方法之前进入DB。
一种解决方法是显式执行Session flush()(您可以考虑放入DAO的create()),这样它就会触发数据库更新,从而导致您希望抛出异常。