hibernate关于事务和sqlsession的几个坑

我们知道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),即可解决

欢迎关注凯哥公众号:凯哥Java

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凯哥Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值