关于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方法未能存储数据入库的处理过程的更多相关文章

  1. 如何用正则将多个空格看成一个空格结合spllit()方法将文本数据入库

    关键的代码和正则表达式在这里 while((line=br.readLine())!=null) { String[] data=new String[4]; data=line.split(&quo ...

  2. 在使用Hibernate save()方法的时候 报错: org.hibernate.exception.ConstraintViolationException:could not perform addBath

    org.hibernate.exception.ConstraintViolationException:could not perform addBath 错误可能原因:实体属性的值与数据库字段类型 ...

  3. Hibernate save, saveOrUpdate, persist, merge, update 区别

    Hibernate Save hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思.我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原 ...

  4. <笔记>TP5的save方法返回值

    用save方法来更新数据时,若更新前后数据没有改变则返回0,更新成功返回影响行数,更新失败返回false 若想要数据没改变时提示修改成功,则需要严格判断 if(结果!==false){提示成功}而不是 ...

  5. Springboot-mongodb MongoRepository接口 save方法 详解

    问题: 我们都知道 mongodb 有两种添加数据的方式  一种 就是  save 方法   另外一种 insert  方法 这里两个方法 唯一的区别就是 insert:当主键"_id&qu ...

  6. 【hibernate spring data jpa】执行了save()方法 sql语句也执行了,但是数据并未插入数据库中

    执行了save()方法  sql语句也执行了,但是数据并未插入数据库中 解决方法: 是因为执行了save()方法,也执行了sql语句,但是因为使用的是 @Transactional 注解,不是手动去提 ...

  7. [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. vue中的watch方法 实时同步存储数据

    watch 监视模式里面有个独特的方法handler 注意要加上deep: true.deep为true时,当对象的key值改变时也监听 当值发生改变被watch监视到触发了事件 开始执行handle ...

  9. 使用Properties集合存储数据,遍历取出Properties集合中的数据和Properties集合中的方法store和load

    package com.yang.Test.PropertiesStudy; import java.io.FileWriter; import java.io.IOException; import ...

随机推荐

  1. npm 还是 yarn ?

    技术选型时这个问题总是困扰我,今天看到一篇文章,详细的解释了 npm 和 yarn 在性能,安全,支持性和使用难易度上的区别,看完之后这个问题终于有一个答案: 如果你在意速度和 UI,选 yarn,如 ...

  2. winform只能打开一个子窗口

    源地址:https://zhidao.baidu.com/question/1511266887807047660.html 指定弹出的子窗口为模态窗口就可以了,这样在子窗口没有关闭前,是不能操作父窗 ...

  3. 生成对抗网络(GAN)相关链接汇总

    1.基础知识 创始人的介绍: “GANs之父”Goodfellow 38分钟视频亲授:如何完善生成对抗网络?(上) “GAN之父”Goodfellow与网友互动:关于GAN的11个问题(附视频) 进一 ...

  4. Linux中切换前后台命令:ctrl+z,bg,fg,jobs

    一.运行某些服务的时候,我希望切换到后台运行: 两种方法: 1.可以在运行的时候,在启动服务命令的最后面加一个字符&,例如 ./serviceStart & 2.在服务启动后,按ctr ...

  5. logrotate 日志管理

    查看logrotate 是否已安装 因为linux安装软件的方式比较多,所以没有一个通用的办法能查到某些软件是否安装了.总结起来就是这样几类: 1.rpm包安装的,可以用rpm -qa看到,如果要查找 ...

  6. C语言变量:名称、地址和值

    变量的名称.地址和变量的值之间关系密切. 我们可以认为变量有两个属性:名称和值(其他属性暂不讨论): 计算机编译和加载后也认为变量有两个属性:地址和值.地址就是变量在计算机内部的名称. 许多语言中地址 ...

  7. Jenkins自动化CI CD流水线之8--流水线自动化发布Java项目

    一.前提 插件:Maven Integration plugin 环境: maven.tomcat 用的博客系统代码: git clone https://github.com/b3log/solo. ...

  8. Android + Appium 自动化测试完整的环境配置及代码详解

    环境的的搭建 参考大神博客:https://www.cnblogs.com/fnng/p/4540731.html 该博客有一套详细的入门教程,奈何时间有点久远有些东西不能用了,但是参考价值还是有滴. ...

  9. jupyter notebook自动补全功能实现

    Jupyter notebook使用默认的自动补全是关掉的.要打开自动补全,需修改默认配置. 命令行中输入:ipython profile create 以上命令会在~/.ipython/profil ...

  10. GM MDI Tech 3 VS GM tech 2

    Many customers ask for this question: what is the difference between GM tech 2 and GM MDI Tech 3 sca ...