Hibernate:需要在事务中保存同一个对象两次

标签 hibernate

我需要在事务中保存同一个对象两次,但是 hibernate 总是只有一个 sql 更新,有什么办法吗? 这是代码:

....
session.beginTransaction();
Student s = session.get(Student.class, id);

// (1) first save 
s.setSequenceNum(10);
session.saveOrUpdate(s);

// (2) second save
s.setSequenceNum(9);
session.saveOrUpdate(s);  // save again

session.getTransaction().commit();
session.close();

hibernate 将忽略第一个,而第二个只有一个 sql 更新。我怎样才能让 hibernate 同时执行这两个 sql 更新?我需要这个,因为这是我们项目中的要求。

最佳答案

saveOrUpdate 对于附加实例是完全没有必要的。 Hibernate 会自动持久化附加对象的状态

  • 在交易结束时
  • 执行结果可能取决于对象的新状态的查询时
  • 在 session 中显式调用 flush 时

附加对象是您从 session 中检索到的对象(通过对获取、加载或查询的调用),或者您通过持久化、保存、更新或合并(在后一种情况下)使持久化的对象,传递的对象没有附加,但返回的对象是)。

那为什么 saveOrUpdate 有用呢?使 transient 或分离的对象持久化很有用,即未附加到 session 的对象,无论是因为它是新对象,还是因为它之前已附加,但在 session 关闭时变得分离。

Hibernate 的想法是仅在必要时在尽可能晚的时间刷新修改后的状态(即执行更新 SQL 查询)。这样,它可以避免不必要的更新,从而使代码更高效。您的第一次更新是不必要的,除非您在两次更新之间的同一事务中执行 native SQL 查询。为什么要保留中间状态?

关于Hibernate:需要在事务中保存同一个对象两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7103547/

相关文章:

java - Hibernate 查询返回空结果列表

java - 具有 hibernate 和超时等待空闲对象异常的tomcat数据源

java - 运行 Spring Boot JPA 测试时数据库中没有持久化值

java - Spring 3.2 + Hibernate 4 OpenSessionInViewFilter

java - Spring 启动: Handle Raised Exception from Database Trigger

在 Netbeans 8.0.2 中看不到 Hibernate Framework 选项

mysql - hibernate 异常 : While migrating from mysql to oracle 11g db

Hibernate更新主键,批量更新从update [0]返回意外的行数;实际行数 : 0; expected: 1

java - 如何在 JPA 中创建具有预定义值的表

java - Spring DataJPA 中的延迟初始化