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

  今天交给外包的活遇到一个问题,喊我一起研究,最后解决,让我对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 。

时间: 2024-08-06 14:35:18

SpringMVC+Hibernate架构save方法事务未提交的相关文章

spring+springmvc+hibernate架构、maven分模块开发例子小项目案例

maven分模块开发例子小项目案例 spring+springmvc+hibernate架构 以用户管理做测试,分dao,sevices,web层,分模块开发测试!因时间关系,只测查询成功,其他的准备在ext上做个完整的案例来的,可惜最近时间很紧, 高级部分也没做测试,比如建私服,其他常用插件测试之类的,等用时间了我做个完整ext前端和maven 完整的例子出来,在分享吧! 不过目前这些撑握了,在项目中做开发是没有问题的,其他高级部分是架构师所做的. 之前我有的资源都加上了积分,有些博友向我要,

spring+springmvc+hibernate架构、maven分模块开发样例小项目案例

maven分模块开发样例小项目案例 spring+springmvc+hibernate架构 以用户管理做測试,分dao,sevices,web层,分模块开发測试!因时间关系.仅仅測查询成功.其它的准备在ext上做个完整的案例来的,可惜近期时间非常紧. 高级部分也没做測试,比方建私服,其它经常使用插件測试之类的,等用时间了我做个完整ext前端和maven 完整的样例出来,在分享吧. 只是眼下这些撑握了.在项目中做开发是没有问题的,其它高级部分是架构师所做的. 之前我有的资源都加上了积分,有些博友

SQLServer之创建事务未提交读

未提交读注意事项 使用 SET TRANSACTION ISOLATION LEVEL 指定会话的锁定级别. 一次只能设置一个隔离级别选项,而且设置的选项将一直对那个连接始终有效,直到显式更改该选项为止. 事务中执行的所有读取操作都会在指定的隔离级别的规则下运行,除非语句的 FROM 子句中的表提示为表指定了其他锁定行为或版本控制行为. 事务隔离级别定义了可为读取操作获取的锁类型. 在事务进行期间,可以随时将事务从一个隔离级别切换到另一个隔离级别,但有一种情况例外. 即在从任一隔离级别更改到 S

mysql事务未提交导致锁等待如何解决

1.实验环境 Myql版本5.7.17-log 实验表结构 ([email protected])[apex]> show create table test; +-------+-----------------------------------------------------------------------------------------------------------------------------------+ | Table| Create Table      

backbone Model调用save方法的时候提交方式

horizon使用的是backbone框架,但是我们的后台api都是只接收post请求,请求的路径为/api/,根据backbone的官档解释: backbone的model.save方法会判断当前的model对象是否存在存在服务器中,如果存在服务器中,则调用"update" (HTTP PUT), 如果不存在,则调用"create" (HTTP POST), 判断的依据即为当前的model的属性'id'是否存在. 举例如下: var UpdateAgentV =

关于hibernate用save方法保存对象所遇到的一个问题

执行数据库循环保存操作时,开始想只new一个对象,这样会节省一些空间,所以在for循环外面执行new操作,在for循环里面则执行设值操作,然后每次都提交事务到数据库.如下图: 结果发现数据库里只插入了一条数据,查看sql语句才发现问题的所在,sql语句如下: hibernate只执行了一次insert操作,剩下的都是更新操作,所以最后表里面只有一条数据. 然后我就进行了修改,在每一次for循环里都new一个对象,如下图: 执行插入操作后查看sql语句,发现这次就插入成功了,执行了5次的inser

Hibernate的save方法不能进行数据库插入

问题描述 在 MyEcplise 上运行 tomcat,利用 po 模板自动生成 po 文件,调用 po 的 save 方法,不报错,但是无法把数据插入数据库 applicationContext.xml 中文件配置 <bean id="SysConfigDAO" class="com.po.SysConfigDAO"></bean> po 中 dao 文件的引用 public class UserDAO extends BaseHibern

spring HibernateTemplate.save() 方法的自动提交问题

如题: service1: dao1.save(obj);   //失败,应该给spring捕获,但没有,程序继续执行下去了. redisService.fun1();  //被执行 service2: dao1.update(obj);   //失败,错误给spring捕获,抛出异常,程序终止. redisService.fun1(); 经过查找相关资料,确认是因为数据库表主键的问题        <id name="id" type="java.lang.Strin

hibernate的save方法与sql的insert的区别

public boolean addDiscuss(Discuss discuss) {// Session session = HibernateSessionFactory.getSession();// 获得Session对象// try {// session.save(discuss);// 保存信息 ,不可行error,Cannot add or update a child row: a foreign key constraint fails // } catch (Except