zoukankan      html  css  js  c++  java
  • 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不使用事务无法保存或修改数据问题

  • 相关阅读:
    JavaWeb--HttpSession案例
    codeforces B. Balls Game 解题报告
    hdu 1711 Number Sequence 解题报告
    codeforces B. Online Meeting 解题报告
    ZOJ 3706 Break Standard Weight 解题报告
    codeforces C. Magic Formulas 解题报告
    codeforces B. Sereja and Mirroring 解题报告
    zoj 1109 Language of FatMouse 解题报告
    hdu 1361.Parencodings 解题报告
    hdu 1004 Let the Balloon Rise 解题报告
  • 原文地址:https://www.cnblogs.com/SunSAS/p/14509997.html
Copyright © 2011-2022 走看看