Spring的管理下,Hibernate 保存对象异常只能在Action层被捕获

探讨Hibernate在处理空字段时如何影响Spring管理的事务,解释为何异常仅在Action层被捕获,而非预期的多层捕获。

一、问题描述

       由于开发框架调用数据库的连接使用到了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层被捕获了。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值