hibernate自动提交更新的问题

在项目中遇到的记录一下

大致场景伪代码如下:

//查询到对象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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开启 Hibernate 5 的批处理需要两个配置:hibernate.jdbc.batch_size 和 hibernate.order_inserts。hibernate.jdbc.batch_size 表示批处理大小,hibernate.order_inserts 表示是否按照实体类的顺序插入数据。其操作步骤如下: 1. 在 Hibernate 配置文件中添加 hibernate.jdbc.batch_size 和 hibernate.order_inserts 配置; 2. 创建 Session 对象; 3. 开启事务; 4. 循环将多个对象添加到 Session 中; 5. 提交事务; 6. 关闭 Session。 下面是一个示例代码,假设要将多个用户信息批量插入到数据库中: ```java Session session = null; Transaction tx = null; try { // 添加 hibernate.jdbc.batch_size 和 hibernate.order_inserts 配置 Properties prop = new Properties(); prop.setProperty("hibernate.jdbc.batch_size", "50"); prop.setProperty("hibernate.order_inserts", "true"); sessionFactory = new Configuration().configure().addProperties(prop).buildSessionFactory(); // 创建 Session 对象 session = sessionFactory.openSession(); // 开启事务 tx = session.beginTransaction(); // 循环将多个对象添加到 Session 中 for (User user : users) { session.save(user); } // 提交事务 tx.commit(); } catch (Exception e) { // 回滚事务 if (tx != null) { tx.rollback(); } e.printStackTrace(); } finally { // 关闭 Session if (session != null) { session.close(); } } ``` 其中,users 是一个 User 对象的集合,表示多个用户信息。在添加完所有对象后,直接提交事务即可,Hibernate自动开启批处理。需要注意的是,批处理只在插入操作时起作用,更新和删除操作不会使用批处理。同时,批处理也可能会导致主键冲突等问题,需要根据实际情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值