hibernate做查询操作出现更新问题

在使用Hibernate进行查询时,发现修改RsLeave类的type属性后,即使没有保存,数据库中的值也会被更新。原因是Hibernate在查询时检查对象状态,若有变化则触发更新。解决办法包括将修改操作移到查询之后或在事务中设置只读属性。
摘要由CSDN通过智能技术生成

这里写图片描述

出现问题:首先这段代码在action层,查询出RsLeave类后修改这个类的type属性(红色箭头所示),后面继续进行RsLeave关联类的查询(绿色箭头所示),程序运行后发现数据库中当前RsLeave中type值已经被修改,因此推出虽然表面进行只是查询,但其实内部也发生了更新操作。
解决办法:1:把修改type属性的操作放到所有查询操作后
2:在事物层的查询方法中添加事物为只读(@Transactional(readOnly=true))
问题分析:hibernate在做查询操作的时候会去查找session中当前类的属性值与关联类的属性值是否发生改变,如果发生改变则会进行更新操作。

2018-8-1:
今天被同事发现代码中又出现类似的bug问题,所以仔细的看了一下对应的hibernate源码实现。源码路径为:org.hibernate.internal.SessionImpl

/**
     * detect in-memory changes, determine if the changes are to tables
     * named in the qu
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值