今天遇到一个问题,就是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。