Hibernate 没有事务无法增删改

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

可参考 Hibernate3不使用事务无法保存或修改数据问题

原文地址:https://www.cnblogs.com/SunSAS/p/14509997.html