关于hibernate save方法未能存储数据入库的处理过程
关于hibernate save方法未能存储数据入库的处理过程
2018年04月18日 10:57:49 守望dfdfdf 阅读数:230更多
个人分类: 工作 问题
编辑
版权声明:本文为博主原创文章,转载请注明文章链接。 https://blog.csdn.net/xiaoanzi123/article/details/79876281
想要把数据,封装到bean内部,利用hibernate的save方式储存,结果发现虽然没有任何异常,但是表里面并没有出现插入的数据。这时我想到出现这种情况只能是事务上的问题(没有提交)。于是我决定手动创建事务去执行这个save。相关代码如下:
dao层相关代码如下:(关键是通过利用dao中的sessionFactory去获取session),

业务中的代码 改为 如下手动操作事务的方式:
Session session = xxxDao.getSession();
try{
session.beginTransaction();
xxxDao.save(dto bean对象);
session.getTransaction().commit();
}catch(Exception e) {
logger.error("xxxxxxxx 出现错误,事务回滚");
session.getTransaction().rollback();
}
然后问题就出现了:程序一旦执行到session.beginTransaction(); 这个位置,就报错(具体异常我忘记了。。。不过不影响说明问题)。也就是说手动事务创建失败。
究其原因,在于spring的application.xml中对事务的管理配置:看一下 spring 的advice通知的配置:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" read-only="true" />
<tx:method name="get*" read-only="true" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="submit*" propagation="REQUIRED" />
<tx:method name="remove*" propagation="REQUIRED" />
<tx:method name="copy*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="discard*" propagation="REQUIRED" />
<tx:method name="retrieve*" propagation="REQUIRED" />
<tx:method name="query*" propagation="REQUIRED" read-only="true" />
<tx:method name="select*" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice>
可以看到,find、get等等开头的方法,都会有对应的 事务 传播特性 配置,由spring来管理。而我的方法竟然是以get开头的,再根据REQUIRED的传播特性,就不难理解了,我自己手动创建 事务 ,此时与配置的事务传播特性 冲突。
我的解决办法是把方法名改了,不再以get开头。这样配置的事务传播特性 不会影响自己手工开启事务。成功利用手动创建事务把数据存储入库【注意,通知主要配置的是事务的传播特性】。
而 事务织入的位置 具体得 参见aop配置的 位置 。
至于刚开始由spring管理事务为啥数据没有存进去?我估计是之前application.xml中事务管理器我的配置有问题,因为当时配了双数据源,多配置一个事务管理器,具体配置参见我的当时记录的博客
https://blog.csdn.net/xiaoanzi123/article/details/79716758
弄乱了,后来理清楚思路 就把多配的 给删除了。所以现在的application.xml的配置,我也更新在上述博客最后面了。可对比查看变化。这是另外的话了。
而且,(目前方法名已经不再是get开头了),我把手动开关事务代码注释掉,只留下save的代码,测试发现也能够存储数据入库。所以我推测此时只不过不再受到 通知 配置 的事务传播级别的控制限制了,但是事务管理依旧因为aop配置的位置 的原因在生效,把数据成功入库。
关于hibernate save方法未能存储数据入库的处理过程的更多相关文章
- 如何用正则将多个空格看成一个空格结合spllit()方法将文本数据入库
关键的代码和正则表达式在这里 while((line=br.readLine())!=null) { String[] data=new String[4]; data=line.split(&quo ...
- 在使用Hibernate save()方法的时候 报错: org.hibernate.exception.ConstraintViolationException:could not perform addBath
org.hibernate.exception.ConstraintViolationException:could not perform addBath 错误可能原因:实体属性的值与数据库字段类型 ...
- Hibernate save, saveOrUpdate, persist, merge, update 区别
Hibernate Save hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思.我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原 ...
- <笔记>TP5的save方法返回值
用save方法来更新数据时,若更新前后数据没有改变则返回0,更新成功返回影响行数,更新失败返回false 若想要数据没改变时提示修改成功,则需要严格判断 if(结果!==false){提示成功}而不是 ...
- Springboot-mongodb MongoRepository接口 save方法 详解
问题: 我们都知道 mongodb 有两种添加数据的方式 一种 就是 save 方法 另外一种 insert 方法 这里两个方法 唯一的区别就是 insert:当主键"_id&qu ...
- 【hibernate spring data jpa】执行了save()方法 sql语句也执行了,但是数据并未插入数据库中
执行了save()方法 sql语句也执行了,但是数据并未插入数据库中 解决方法: 是因为执行了save()方法,也执行了sql语句,但是因为使用的是 @Transactional 注解,不是手动去提 ...
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- vue中的watch方法 实时同步存储数据
watch 监视模式里面有个独特的方法handler 注意要加上deep: true.deep为true时,当对象的key值改变时也监听 当值发生改变被watch监视到触发了事件 开始执行handle ...
- 使用Properties集合存储数据,遍历取出Properties集合中的数据和Properties集合中的方法store和load
package com.yang.Test.PropertiesStudy; import java.io.FileWriter; import java.io.IOException; import ...
随机推荐
- 【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS
[bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t n=1 当 a=1 当 a=0 判断b==t /* http: ...
- hdu4651(广义五边形数 & 分割函数1)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:f(x) 为将 x 分成其他数和的形式的方案数.对于 t 组输入,输出 f(xi). 思路 ...
- kuangbin专题七 ZOJ1610 Count the Colors (灵活线段树)
Painting some colored segments on a line, some previously painted segments may be covered by some th ...
- mybatis和jdbc分析
从这个图上可以看出mybatis的整体执行图 jdbc的 mybatis对很多类型进行了转化,减少了开发的量
- pre 标签 防止 其撑开 div...
pre 里面 的内容如果不换行,会导致 div 横向 出现 滚动条...加入下列 css可解决! pre{ white-space: pre-wrap; word-wrap: break-word; ...
- Apache 403 错误。。
两个方面.. 一: httpd.conf 是否有 <directory '/www'></directory> 是否有 Deny from all 或者 Require l ...
- maven mirrorOf
转载 http://blog.csdn.net/isea533/article/details/21560089 在maven中配置一个mirror时,mirror通常会设置成*,还有可能是一个具体的 ...
- freemarker 定义公共header
<#--公共顶部--> <#macro header title="默认文字" keywords="默认文字" description=&qu ...
- Luogu P2107 小Z的AK计划 堆贪心
好久不做这种题了... 存一下每个点的位置和时间,由于达到某个位置跟之前去哪里AK的无关,所以在时间超限后,可以用大根堆弹掉之前消耗时间最大的,来更新答案,相当于去掉之前花费最大的,直到时间不在超限. ...
- javascript中的一元操作符
题目如下: var s1 = "01"; var s2 = "1.1"; var s3 = "z"; var b = false; var ...