关于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 ...
 
随机推荐
- Struct结构体
			
1.结构体的定义与调用 // 定义结构体类型 // 结构体类型名为 MyDate1 struct MyDate1 { int year; int month; int day; }; // 定义结构体 ...
 - Java框架之搭建环境maven报错
			
*maven Dependencies 中的地址通过POM 才会增加 正确是 1. m2所在位置 遇到的问题: java.lang.ClassNotFoundException: org.spring ...
 - 10.Find All Anagrams in a String(在一个字符串中发现所有的目标串排列)
			
Level: Easy 题目描述: Given a string s and a non-empty string p, find all the start indices of p's ana ...
 - Qt 学习之路 2(22):事件总结
			
Qt 学习之路 2(22):事件总结 豆子 2012年10月16日 Qt 学习之路 2 47条评论 Qt 的事件是整个 Qt 框架的核心机制之一,也比较复杂.说它复杂,更多是因为它涉及到的函数众多,而 ...
 - Python迭代器生成器,模块和包
			
1.迭代器和生成器 2.模块和包 1.迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法. 其中__it ...
 - [Leetcode]013. Roman to Integer
			
public class Solution { public int romanToInt(String s) { if(s == null || s.length() == 0) return 0; ...
 - 支付宝支付集成中:refund_fastpay_by_platform_nopwd接口服务器通知验签不通过
			
在做p2p配资平台,也就是公司的项目,遇到了一个问题:refund_fastpay_by_platform_nopwd接口服务器通知验签不通过 下面是实录: 通知服务器的POST过来的数据: 1.si ...
 - 签名:实现参数字典排序,然后拼接为url参数形式
			
在很多地方请求参数需要做处理例如: 步骤 1.参数字典排序. 2.拼接字符. /// <summary> /// 生成签名 /// </summary> /// <par ...
 - 【ACM】三点顺序
			
三点顺序 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给出的还是逆 ...
 - VMware Workstation 12.5.9 Pro虚拟机软件中文版
			
更新为 VMware Workstation 12.5.9 pro版.VMware虚拟机软件无疑是windows系统下最强大好用的虚拟机软件.最新的VMware Workstation 12 Pro ...