首页 > 学院 > 开发设计 > 正文

Hibernate自动事务揪出的编码不规范

2019-11-14 21:06:15
字体:
来源:转载
供稿:网友
Hibernate自动事务揪出的编码不规范 2014-09-09 14:59 by 一人游走, ... 阅读, ... 评论, 收藏, 编辑

最近重构的项目(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这样的动词开头,方便全局控制。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表