• 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不使用事务无法保存或修改数据问题

  • 相关阅读:
    springboot使用MockMvc测试controller
    MySQL5.6版本之后设置DATETIME类型自动更新
    MAVEN打包时跳过Junit测试
    没看这篇干货,别和我说你会IDEA Debug
    java通过HtmlUnit工具和J4L实现模拟带验证码登录
    Vue+Java实现在页面树形展示文件目录
    exceptions: django2.2/ mysql ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3
    linux 软连接的使用
    Linux pip命令报错 -bash: pip: command not found
    MySQL使用命令导出/导入数据
  • 原文地址:https://www.cnblogs.com/SunSAS/p/14509997.html
Copyright © 2020-2023  润新知