码迷,mamicode.com
首页 > 编程语言 > 详细

SpringMVC+Hibernate架构save方法事务未提交

时间:2014-12-04 23:07:23      阅读:313      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   sp   java   on   文件   数据   

  今天交给外包的活遇到一个问题,喊我一起研究,最后解决,让我对spring的事务管理又加深了印象。

  先简单说一下项目:项目是Spring和Hibernate集成的JavaEE项目,MVC架构。

  外包在service层一个以get开头的方法中写了一些业务逻辑,分别调用了dao层的save和get方法,但是发现get的数据正常显示,数据表中该save的并没有存入数据表,查hibernate生成的sql也只查到了get的语句,没有发现save的语句,也没有报任何错误。很奇怪的现象,不怕报错,就怕它不报错~

  遂检查了一遍代码,没有发现嫌疑。打断点跟踪发现save的这玩意儿可以在程序中get得到,证明hibernate缓存中有save进去的值,可能是hibernate没有提交save,可是写在同一个方法中的get正常提交了。于是想到了配置问题,因为在service层配置了事务,而其他层没有。

  所以,找到了spring的配置文件:

            <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
            <tx:method name="save*" propagation="REQUIRED"/>

郝然发现其中以get开头的service方法的事务配置了只读属性,而以save开头的service方法的read-only是默认值false。

  原因找到了:因为service方法是以get开头的,所以只有读的权限没有写的权限,无法提交save动作。

 

解决方案:

  1、最简单。方法名字别以get开头,以其他配置了REQUIRED隔离级别前缀的字符串开头。

  2、比较规范。DAO层的基本增删改查动作都在service层实现一遍(调用DAO),并为其配置相应权限的事务,提供统一的带独立事务的增删改查服务方法,然后无论本service类内还是类外都调用这几个基本增删改查方法去实现业务逻辑。

  笔者推荐方案2 。

 

SpringMVC+Hibernate架构save方法事务未提交

标签:style   blog   io   color   sp   java   on   文件   数据   

原文地址:http://www.cnblogs.com/jimmy-c/p/4143899.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!