关于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 ...
随机推荐
- windows 注册表
注册表(Registry,繁体中文版Windows称之为登录)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息.早在Windows 3.0推出OLE技术的时候 ...
- codevs1068(dp)
题目链接: http://codevs.cn/problem/1068/ 题意: 中文题诶~ 思路: dp 用 dp[i][j][k][l] 表示取 i 个 1, j 个 2, k 个 3, l 个 ...
- linux 基本概念
Linux把物理内存分为了固定统一大小的块,称为page(页框),一般为4KB. Linux采用4KB页框大小作为标准的物理内存分配单元,内核用数据结构page描述一个页框的状态信息,其实页是进程的概 ...
- php屏蔽错误消息
定义和用法: error_reporting() 设置 PHP 的报错级别并返回当前级别. 函数语法: error_reporting(report_level) 如果参数 level 未指定,当前报 ...
- [SCOI2007]蜥蜴 BZOJ1066 最大流
题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴 ...
- 前三次OO作业总结
一.作业总结 前三次的任务都是表达式求导.这是我在高中就思考过的问题,但是很久都没有付诸实践,直到学习了"类"这个强大的工具.还有正则表达式,如果能适当使用,则不失为一个字符串格式 ...
- python编程技巧
- python 根据 数据库创建java 文件
#coding=utf-8 import pymysql import os import re # 包全路径 packagepath=r'E:\idea工程\dc-exam\dc-exam\src\ ...
- vue js 实现 树形菜单
添加一个模板.<template id="menu-template"> <li v-if="model.nodes!=undefined"& ...
- Experimental Educational Round: VolBIT Formulas Blitz K
Description IT City company developing computer games decided to upgrade its way to reward its emplo ...