Я попытаюсь объяснить на более конкретном примере. Предположим, у вас есть сценарий, как показано ниже:
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();
Исключение при попытке присоединить отдельный объект, 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.
Чтобы обойти вышеуказанную проблему, используется merge (), как показано ниже:
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();