我正在使用Spring MVC和hibernate开发一个用于持久性的Web应用程序。 鉴于我的DAO GenericDao有一个SessionFactory成员属性:
@Repository
public class Dao extends GenericDao {
public void save(Object o) {
getCurrentSession().save(o);
}
}
服务类
@Service
public class MyService {
@Autowired
Dao dao;
@Transactional
public void save(Object o) {
dao.save(o);
}
}
我想通知我的用户是否发生了持久性异常(约束,重复等)。据我所知,@Transactional
注释仅在异常冒泡并且事务管理器回滚时才有效,因此我不应该在该方法中处理异常。我应该在哪里以及如何捕获DAO中发生的异常,以便我可以将其直接呈现给我的用户,或者包含在我自己的异常中?
我想使用spring的交易支持。
答案 0 :(得分:4)
Spring提供了异常处理程序。
所以你可以在你的控制器中有类似的东西来处理ConstraintViolationException
@ExceptionHandler(ConstraintViolationException.class)
public ModelAndView handleConstraintViolationException(IOException ex, Command command, HttpServletRequest request)
{
return new ModelAndView("ConstraintViolationExceptionView");
}
答案 1 :(得分:0)
在追逐问题一段时间后,我通过使用异常处理程序(如另一个答案中所述)和rollbackFor
注释的@Transactional
属性解决了这个问题:
@Transactional(rollbackFor = Exception.class)
我的异常处理程序仍然被调用并相应地写入响应,但事务将被回滚。