一、问题描述
由于开发框架调用数据库的连接使用到了Hibernate,在进行save操作的时候,由于某个字段为空导致对象保存失败。我在Action、Service、Dao层均进行了异常的捕获,当时最终只在Action层捕获到了错误,在其他层异常均“逃跑”了
Action层
try{
testService.save(bo);
}catch(Exception){
System.out.println("--------------Action:捕获异常---------------");
}
Service层
try{
testDao.save(bo);
}catch(Exception){
System.out.println("--------------Service:捕获异常---------------");
}
Dao层
try{
this.getHiberanteTemplate().save(bo);
}catch(Exception){
System.out.println("--------------Dao:捕获异常---------------");
}
我保存bo对象的时候,有一个属性为null。所以按道理异常应该是从Dao层依次被捕获,所有输出应该为
--------------Dao :捕获异常 -------------------
--------------Service :捕获异常 -------------------
--------------Action:捕获异常 -------------------
但是实际的输出结果却是为:
--------------Action:捕获异常 -------------------
二、问题原因
由于Hibernate将事务托管给了Spring进行管理,所以Hibernate事务的开启和关闭是由Spring进行管理。而正常情况下,Spring是一个Service方法对应事务,也就是说在①Service层save方法被调用前事务开启,方法调用结束后事务提交。②我们知道,hibernate进行保存、删除、修改的操作需要进行事务的提交。结合这两个点,我们可以知道将数据保存到数据库实际是在Service层save方法操作结束后进行的,因此这就可以解释为什么异常只在Action层被捕获了。
探讨Hibernate在处理空字段时如何影响Spring管理的事务,解释为何异常仅在Action层被捕获,而非预期的多层捕获。

731





