我会尽量用一个更具体的例子来解释。假设您的场景如下所示:
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User userA = (User)session.get(User.class, 1101);
transaction.commit();
session.close();
// Since session is closed, userA is detached.
session = sessionFactory.openSession();
transaction = session.beginTransaction();
User userB = (User)session.get(User.class, 1101);
//Now here, userB represents the same persistent row as userA.
//When an attempt to reattach userA occurs, an exception is thrown
session.update(userA);
transaction.commit();
session.close();
尝试重新挂接Detached对象userA时发生异常。
Exception in thread "main" org.hibernate.NonUniqueObjectException: a
different object with the same identifier value was already associated
with the session:
This is because Hibernate is enforcing that only a single instance of a Persistent object exists in memory.
为了解决上述问题,合并()时,如下图所示:
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User userA = (User)session.get(User.class, 1101);
transaction.commit();
session.close();
//userA is now detached as session is closed.
session = sessionFactory.openSession();
transaction = session.beginTransaction();
User userB = (User)session.get(User.class, 1101);
User userC = (User)session.merge(userA);
if (userB == userC) {
System.out.println("Reattched user is equal");
}
transaction.commit();
session.close();
该链接可能是有用的: http://stackoverflow.com/questions/ 161224 /如果我使用save()不合并(),那么这是正确的,这是不同的节能方法之间的区别在休眠 – Gaurav 2012-01-13 05:04:57