在我们的应用程序中,我们使用服务层的注释来应用spring声明式事务。
在这里,我不知道如何正确处理异常。
我的要求是什么,当dao层抛出任何hibernate异常时我们正在回滚事务,但在一种情况下我得到InvalidDataAccessResourceUsageException
因为发生了唯一的索引违规。所以我想在这里做的是我想在服务类中捕获InvalidDataAccessResourceUsageException
异常,并且必须将特定于应用程序的异常重新抛出到控制器。
但是这里发生的事情是因为我们在服务层类中有事务划分,会话在执行方法后在服务层刷新(即当tx提交时),因此我无法将其捕获到相同的方法中并且它直接传播到控制器。
请建议我解决这个问题。
还要求再澄清一下,假设我有一个类似下面的方法
@Transactional(value="transactionManager",readOnly = false, propagation = Propagation.REQUIRED,rollbackFor = HibernateException.class)
public SomeDTO editObject(SomeDTO someDto, String user) throws EditException {
try{
/*
call to dao.edit();
another call to anotherDao.addEditsTOAnotherTable();
some business logic*/
} catch(HibernateException e){
} catch(InvalidDataAccessResourceUsageException ie){}
}
我能否抓住上述例外情况。注意:我没有处理或抛出dao的任何异常。此外,在dao层没有像FlushMode.ALWAYS
等会话缓存机制,因为它会在tx.commit()
期间刷新。
答案 0 :(得分:-1)
最好在编辑到数据库之前检查所有数据库约束