今天遇到一个问题,就是hibernate不报错,但数据库无法修改数据
// controller
public ResponseObject banAidouUnblock(@RequestParam Map<String, Object> param){ // 省略其他代码 return banService.banAidouUnblock(param, map); }
// banService
@Override public ResponseObject banAidouUnblock(Map<String, Object> param, Map<String, Object> map) { ResponseObject responseObject = this.saveBanOpenInfo(param); // 省略其他 }
我这么调用,可以执行 saveBanOpenInfo 方法,但是数据库总是没有改变。
然而之前的一种方式就可以。
public ResponseObject ban_open_save(@RequestParam Map<String, Object> param) {
return this.banService.saveBanOpenInfo(param);
}
区别就只是我在service层调用此service的另一个方法就不行,而controller直接调用就可以。
我以为不能这么调用,但之前从未遇到过。应该不是这个原因,后来问了同事,才发现是方法名有问题。需要以save....开头。
原来此项目配置了事务aop,以下开头的都会加上事务:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 事务执行方式
REQUIRED:指定当前方法必需在事务环境中运行,
如果当前有事务环境就加入当前正在执行的事务环境,
如果当前没有事务,就新建一个事务。
这是默认值。
-->
<tx:method name="getSettingsValueByKey" propagation="REQUIRED" />
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="remove*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="send*" propagation="REQUIRED" />
<tx:method name="import*" propagation="NOT_SUPPORTED"/>
<tx:method name="virtualtel_save" propagation="NOT_SUPPORTED"/>
<tx:method name="synDataToWangJing" propagation="NOT_SUPPORTED"/>
<tx:method name="requestUserCheckInTime" propagation="NOT_SUPPORTED"/>
<!-- <tx:method name="*_NoTr" propagation="NOT_SUPPORTED"/> -->
<tx:method name="in*" propagation="REQUIRES_NEW" rollback-for="Exception"/>
<tx:method name="getUserByCode" propagation="REQUIRED" read-only="true" />
<!--
指定当前方法以非事务方式执行操作,如果当前存在事务,就把当前事务挂起,等我以非事务的状态运行完,再继续原来的事务。
查询定义即可
read-only="true" 表示只读
-->
<tx:method name="*" propagation="NOT_SUPPORTED" read-only="true" />
</tx:attributes>
</tx:advice>
关键点是没有开启事务,如果手动加了@Transcational注解开启事务也可。
源头其实是由于Hibernate 的AutoCommit 默认设置为 false。