Hibernate:需要在事务中两次保存相同的对象

时间:2011-08-18 06:58:32

标签: 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更新?我需要这个,因为这是我们项目的要求。

2 个答案:

答案 0 :(得分:9)

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

  • 在交易结束时
  • 执行查询,其结果可能取决于对象的新状态
  • 在会话上明确地调用flush

附加对象是您从会话中检索的对象(来自对get,load或查询的调用),或者您通过持久,保存,更新或合并(在后一种情况下)持久化的对象,传递的对象没有附加,但返回的对象是)。

那么为什么saveOrUpdate有用呢?使瞬态或分离对象持久化是有用的,即一个没有附加到会话的对象,因为它是新的,或者因为它先前被附加,但在会话关闭时变得分离。

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

答案 1 :(得分:4)

在第一次更新后尝试session.flush()或在第一次更新之前设置session.setFlushMode(FlushMode.Always)。请记住,如果在事务

之后重用会话,setFlushmode将影响整个会话