hibernate自动提交更新的问题

本文探讨了Hibernate框架中对象状态变更导致意外数据库更新的问题。通过分析,发现Hibernate在事务提交时会检查session缓存中对象的状态变化,从而触发更新操作。文章提供了使用session.evict方法来避免非预期更新的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中遇到的记录一下

大致场景伪代码如下:

//查询到对象user
User user = session.get(User.class,1);
//根据user的属性gender(存的是code)查出对应的name
Gender gender = session.creatQuery("form Gender where code = '"+a.getGender()+"'").list().get(0);
String gen_name = gender.getName();
//将查到的属性设置回去user中
user.setGender(gen_name);
......

最后发现user对象的gender属性被更新成了gender的name,查看控制台发现发出了update语句,然后并没有调用

session.update(user);

方法。

网络搜索问题发现hibernate会在事务提交,因为当我们执行get方法的时候,其实在内存中,session缓存中,数据库中都有对应的User对象。而当我们改变其内存中对象的名字的时候。我们再提交的话,其实是数据库事务会去检测,内存中的session对象的值和缓存session中的值是否一致,不一致的话,那么则提交更新。

session.getTransaction().commit();

的时候提交含有更新的内容(spring 管理事务自动提交也会造成同样的问题)。

解决办法:对有属性设置但是不想提交更新的对象使用

session.evict(Object object);//从session缓存中逐出指定对象

然后上面的代码就这样写就不会造成非预想的更新了

//查询到对象user
User user = session.get(User.class,1);
session.evict(user);//从session缓存中逐出user对象
//根据user的属性gender(存的是code)查出对应的name
Gender gender = session.creatQuery("form Gender where code = '"+a.getGender()+"'").list().get(0);
String gen_name = gender.getName();
//将查到的属性设置回去user中
user.setGender(gen_name);
......

也许还有别的更好的解决办法,暂时没有精力深究。

参考文章:https://www.cnblogs.com/yjhrem/articles/2374818.html

参考文章:https://www.cnblogs.com/owenma/p/3481497.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值