SpringMVC+Hibernate架构save方法事务未提交
2014-12-04 21:17
246 查看
今天同事遇到一个问题,一起研究,最后解决,让我对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的配置文件:
郝然发现其中以get开头的service方法的事务配置了只读属性,而以save开头的service方法的read-only是默认值false。
原因找到了:因为service方法是以get开头的,所以只有读的权限没有写的权限,无法提交save动作。
解决方案:
1、最简单。方法名字别以get开头,以其他配置了REQUIRED隔离级别前缀的字符串开头。
2、比较规范。DAO层的基本增删改查动作都在service层实现一遍(调用DAO),并为其配置相应权限的事务,提供统一的带独立事务的增删改查服务方法,然后无论本service类内还是类外都调用这几个基本增删改查方法去实现业务逻辑。
笔者推荐方案2 。
先简单说一下项目:项目是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 。
相关文章推荐
- Spring基础五之Springmvc和hibernate事务不提交
- Hibernate 在事务管理下,save之后获取Id的方法
- hibernate框架中附带提交事务的方法getCurrentSession()
- hibernate中各种保存方法的区别 save persist update saveOrUpdate merge lock
- spring+hibernate架构中Dao访问数据库的几种方法
- SSH 集成项目中getHibernateTemplate().save(Object obj)方法保存数据不能commit 解析
- spring-hibernate事务控制的4中方法
- 在Hibernate中分别使用JDBC和JTA事务的方法
- JAVA hibernate DAO —— save 方法
- spring+hibernate架构中Dao访问数据库的几种方法
- java框架简介1----Hibernate架构使用方法简介
- Hibernate 中save方法运行成功之后却没有保存进数据库的原因
- 用spring管理hibernate事务时,lzay="true"不能用的解决方法
- spring+hibernate架构中Dao访问数据库的几种方法
- spring 声明hibernate 事务的方法(转)
- Hibernate 事务方法保存clob类型数据
- Hibernate的事务提交(ZZ)
- Proxool+hibernate+spring时事务自动回滚导致无法提交的问题解决
- Hibernate 的Session 中的save()方法和persist()方法有什么区别
- Hibernate中对数据库的session操作除了查询操作外,都必须在事务(Transaction)提交后才能执行