关于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 ...
随机推荐
- 青橙 A1280. 最长双回文串
A1280. 最长双回文串 时间限制:2.0s 内存限制:512.0MB 总提交次数: AC次数: 平均分: 将本题分享到: 查看未格式化的试题 提交 试题讨 ...
- 51nod1244 莫比乌斯函数之和(杜教筛)
题面 传送门 题解 我--我忘记把预处理的块的大小调成\(n^{\frac{2}{3}}\)了--(仰天) 首先\(\mu*1=e\) 然后杜教筛就行了 //minamoto #include< ...
- P3941 入阵曲
\(\color{#0066ff}{ 题目描述 }\) 小 F 很喜欢数学,但是到了高中以后数学总是考不好. 有一天,他在数学课上发起了呆:他想起了过去的一年.一年前,当他初识算法竞赛的 时候,觉得整 ...
- P1114 “非常男女”计划
题意:给你一个01串,求满足0和1总数相等的最大字串 $n\ \le\ 10^5$ 1.$O(n^3)$枚举起点终点,统计判断是否成立 2.$O(n^2)$先$O(n)$时间计算01个数的前缀和, ...
- 2017第八届蓝桥杯决赛(C++ B组)2.磁砖样式
磁砖样式 小明家的一面装饰墙原来是 310 的小方格. 现在手头有一批刚好能盖住2个小方格的长方形瓷砖. 瓷砖只有两种颜色:黄色和橙色. 小明想知道,对于这么简陋的原料,可以贴出多少种不同的花样来. ...
- appium环境配置和一个例子
最近觉得appium挺火的,看了一些资料,本来想使用npm在线安装,遇见各种问题,先简单说一下: 在cmd窗口中使用命令:npm install -g appium安装,报无python的error, ...
- Python自动化开发学习20-Django的form组件
武沛齐老师的Django的FORM组件:http://www.cnblogs.com/wupeiqi/articles/6144178.html 转自:http://blog.51cto.com/st ...
- C语言变量:名称、地址和值
变量的名称.地址和变量的值之间关系密切. 我们可以认为变量有两个属性:名称和值(其他属性暂不讨论): 计算机编译和加载后也认为变量有两个属性:地址和值.地址就是变量在计算机内部的名称. 许多语言中地址 ...
- python 分页 封装
分页 封装 我是在项目根目录创建个分页文件 分页代码: class Pagination(object): def __init__(self, data_num, current_page, url ...
- 2015苏州大学ACM-ICPC集训队选拔赛(1) 1008
猪猪过河 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submissi ...