美文网首页凯哥Java-工作总结
hibernate关于事务和sqlsession的几个坑

hibernate关于事务和sqlsession的几个坑

作者: 凯哥Java | 来源:发表于2017-09-06 13:48 被阅读9次

我们知道hibernate是ORM关系型数据库。和数据库交互的时候需要sqlsession,如果是保存、更新、删除操作的时候,还需要有事务。

在spring和hibernate整合的时候,事务都是有spring来处理。有的时候会遇到坑。

异常一:

Could not obtain transaction-synchronized Session for current thread

之前没有问题的。因为修改了部分代码后出现了这个问题。

经过对比之后,发现正当时情况下:

在service层使用了类级别的事务。使用的是spring的@Transactional注解。

出现异常的时候,是事务注解被注释掉了。

错误代码:

使用的是:Session session = getCurrentSession();这个方法。

经过查询得到:

hibernate的sessionFactory中getCurrentSession()方法和OpenSession方法的区别:

所以,Could not obtain transaction-synchronized Session for current thread这个异常的原因是因为使用了 getCurrentSession();获取session 而没有使用@Transactional导致的。

扩展:

使用@Transactional默认只有当方法中抛出unchecked的runtimeException时,才会进行回滚,抛出需捕获的Exception异常是不能进行回滚的

异常二:

A different object with the same identifier value was already associated with the session

错误截图:

错误再现:

先查询。如果存在,重新set指定字段值之后,调用saveOrUpdateEntity的方法。就出现这个异常。

根据错误提示,可以分析得到:

在同一个session中,存在两个相同的标识(如主键id),但是这两个实体有不是相同的。

虽然使用了:

BaseNewinfoViewTotal entity =model.map(bean,BaseNewinfoViewTotal.class);

其实质也相当于是new了一个BaseNewinfoViewTotal 对象。然后重新赋值而已。

所以,两个对象都有相同的主键ID,但是在内存中是两个不同的对象。

这个时候解决方案:

采用session.merge (object c)代替session.save(object c),即可解决

相关文章

  • hibernate关于事务和sqlsession的几个坑

    我们知道hibernate是ORM关系型数据库。和数据库交互的时候需要sqlsession,如果是保存、更新、删除...

  • SqlSession

    SqlSession SqlSession 是 mybatis 主要执行 sql 命令的接口,控制事务、回滚、缓存...

  • 7、spring与hibernate的集成(spring笔记)

    一、spring和Hibernate的集成(编程式事务)(工程spring_hibernate_1) 1.1 op...

  • MyBatis集成到Spring

    使用 MyBatis 的 SqlSession MyBatis 的 提供了执行 SQL 语句、提交或回滚事务和...

  • Spring 事务管理相关知识

    一、事务管理 1. 几种事务 JDBC事务 Hibernate事务 2. Spring 事务管理 产生的原因和一些...

  • Hibernate事务小见

    从自己的一个实例,来看hibernate事务的几个要点: 计划,建立一个文章编辑--保存--发布 事务; 先看一个...

  • Hibernate体系结构

    Hibernate架构包括许多对象持久对象,会话工厂,事务工厂,连接工厂,会话,事务等。 hibernate架构中...

  • 详解Spring的事务管理PlatformTransaction

    常规的事务大致有许多种,比如jdbc事务, Hibernate的事务, JpaTransactionObject事...

  • hibernate体系结构

    Hibernate包括很多对象持久对象,会话工厂、事务工厂、链接工厂、会话、事务等。Hibernate中有4层:J...

  • hibernate

    hibernate默认不提交事务 hibernate有2级缓存 session.save() session.sa...

网友评论

    本文标题:hibernate关于事务和sqlsession的几个坑

    本文链接:https://www.haomeiwen.com/subject/bcamjxtx.html