zoukankan      html  css  js  c++  java
  • Hibernate自动事务揪出的编码不规范

    最近重构的项目(Java初学中),Service层一个获取通知记录报错:

    org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement
    ....
    Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 视图或函数 'v_web_NotifyLog' 不可更新,因为修改会影响多个基表。

    明明是获取记录,哪来的修改,排查逻辑,存储过程...

    模型里面有一属性做了数据修改操作(不规范1)

         public void setLastState(String lastState) {
              if (lastState == null) {
                   this.lastState = "未知";
              } else {
                   this.lastState = lastState;
              }
         }


    在事务结束时(通过AOP配置的自动事务)就会自动提交,将更改回写数据到数据库,就引发了错误!

    在配置AOP时明确制定了哪些Service是只读事务,比如get*、find*,但是这个Service就没有按照这种命名(不规范2):public ResultData preNotifyStatus(int nid, int action) , 改为 getNotifyStatus 问题解决。

        <tx:advice id="txtAdvice" transaction-manager="txtManager">
            <tx:attributes>
                <tx:method name="find*" read-only="true" propagation="REQUIRED" />
                <tx:method name="get*" read-only="true" propagation="REQUIRED" />
                <tx:method name="login*" read-only="true" propagation="REQUIRED" />
                <tx:method name="*" propagation="REQUIRED" />
            </tx:attributes>
        </tx:advice>

    总结:

    1. 模型不要做数据修改,如果需做简单的数据处理,可以考虑在get*中做。
    2. 方法命名要规范,获取数据这样的只读操作一定要用get、find这样的动词开头,方便全局控制。
  • 相关阅读:
    Linux ssh命令详解
    25个必须记住的SSH命令
    什么是SSH 以及常见的ssh 功能
    SSH简介及两种远程登录的方法
    SSH协议(1)-工作原理及过程
    Linux下查看文件内容的命令
    Spring MVC @RequestMapping注解详解
    Spring MVC入门示例
    Spring 基于xml配置方式的事务
    spring @Transactional注解参数详解
  • 原文地址:https://www.cnblogs.com/yryz/p/3962676.html
Copyright © 2011-2022 走看看