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这样的动词开头,方便全局控制。
时间: 2024-10-03 09:01:15

Hibernate自动事务揪出的编码不规范的相关文章

Hibernate的事务管理

Hibernate的事务管理 事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰.作为一名软件设计师,必须了解事务并合理利用,以确保数据库保存正确.完整的数据.数据库向用户提供保存当前程序状态的方法,叫事务提交(commit):当事务执行过程中,使数据库忽略当前的状态并回到前面保存的状态的方法叫事务回滚(rollback). 1  事务的特性 事务具备原子性(Atomicity).一致性(Con

图解ARP协议(三)ARP防御篇-如何揪出&quot;内鬼&quot;并&quot;优雅的还手&quot;

一.ARP防御概述 通过之前的文章,我们已经了解了ARP攻击的危害,黑客采用ARP软件进行扫描并发送欺骗应答,同处一个局域网的普通用户就可能遭受断网攻击.流量被限.账号被窃的危险.由于攻击门槛非常低,普通人只要拿到攻击软件就可以扰乱网络秩序,导致现在的公共网络.家庭网络.校园网.企业内网等变得脆弱无比. 所以,如何进行有效的ARP防御?作为普通用户怎么防御?作为网络/安全管理员又怎么防御?有哪些ARP防御软件?如果被ARP攻击了,如何揪出"内鬼",并"优雅的还手"?

Hibernate自动生成DO手写DAO的注意事项

自动生成DO,手写DAO: Myeclipse添加Hibernate支持:注意别勾abstract 生成DO:进入MyEclipse的Database Explorer右键要操作的表(注意一定要有主键)点击Hibernate Reverse,其中Id选择native. 手写DAO: Configuration con = new Configuration().configure();//构造核心类 SessionFactory factory = con.buildSessionFactory

揪出Android流氓软件

http://www.icpcw.com/Smartphone/Android/Android/1471/147142_all.htm http://www.williamlong.info/archives/3134.html 如果使用豌豆荚或其他应用市场安装APP之后,手机会定期收到一些垃圾推送,打开不是向你推荐程序,就是各种无用的广告,我想你的第一反应绝对是“怒”,接下来就很想知道是哪款软件在捣鬼.难道只能一个一个去卸载?费力又费时.本期小编就来告诉你如何揪出这些潜藏很深的流氓. 引鬼上身

MariaDB日志审计 帮你揪出内个干坏事儿的小子

Part1:谁干的? 做DBA的经常会遇到,一些表被误操作了,被truncate.被delete.甚至被drop.引起这方面的原因大多数都是因为人为+权限问题导致的.一些公共账户,例如ceshi账户,所有的人都可以进行操作,由这些公共账户引起的误操作,你在办公室大喊:谁把我的表删了?8成不会有人回应你. 审计日志功能,该技术主要在MariaDB10.0/10.1和Percona 5.6版本里实现.该功能在MySQL5.6/5.7企业版里也支持.本文主要介绍和演示MariaDB10.1中如何开启审

【经验分享】用adb揪出安卓APP弹窗广告的原形

背景 相信不少安卓用户中过影子弹窗广告的困扰,这种推广APP本体在后台运行,而且可以在其他APP上弹出覆盖广告,一不小心就会误操作,点击广告或者下载APP,着实令人恶心. 以前的广告软件只在通知栏会推送广告,4.4以上版本或者一些rom可以轻易长按管理并找到元凶. 而此升级版却是直接覆盖其他应用程序在屏幕中心和底部直接弹出广告.浏览器.QQ.微信,无一幸免,切换到桌面和最近的应用程序居然可以自动隐藏,大写的服. (中招截图) 无奈之下,笔者把**管家,36*,LE*,金* 全试了一次,竟然没有一

【转帖】因为被蹭网7毛钱,一个博士网管揪出了一个黑客集团

因为被蹭网7毛钱,一个博士网管揪出了一个黑客集团 https://www.huxiu.com/article/321488.html 掉包的存在.. 因为有人蹭网0.75美金,一个博士网管揪出了一个黑客集团,还顺手发明了一套网络安全工具,成为网络安全的先锋.这就是传奇天文学家和数学家 Clifford Stoll 因为失业而做网管时发生的劲爆事件. 本文来自微信公众号:把科学带回家(ID:steamforkids),参考资料:The KGB, the Computer and Me等,编译:七君

MySQL日志审计 帮你揪出内个干坏事儿的小子

MySQL日志审计 帮你揪出内个干坏事的小子 简介 Part1:写在最前 MySQL本身并不像MariaDB和Percona一样提供审计功能,但如果我们想对数据库进行审计,去看是谁把我的数据库数据给删了,该怎么办呢?我们主要利用init-connect参数,让每个登录的用户都记录到我们的数据库中,并抓取其connection_id(),再根据binlog就能够找出谁干了那些破事儿. MariaDB如何审计,可移步: http://suifu.blog.51cto.com/9167728/1857

hibernate 自动生成数据库表

只要在hibernate.cfg.xml添加这句话,就可以自动生成数据表 <property name="hibernate.hbm2ddl.auto">update</property> update:表示自动根据model对象来更新表结构,启动hibernate时会自动检查数据库,如果缺少表,则自动建表:如果表里缺少列,则自动添加列. 还有其他的参数: create:启动hibernate时,自动删除原来的表,新建所有的表,所以每次启动后的以前数据都会丢失.