SessionFactory factory = cfg.buildSessionFactory();
Session session1 = factory.openSession();
Student s1 = null;
Object o = session1.get(Student.class, new Integer(101));
s1 = (Student)o;
session1.close();
s1.setMarks(97);
Session session2 = factory.openSession();
Student s2 = null;
Object o1 = session2.get(Student.class, new Integer(101));
s2 = (Student)o1;
Transaction tx=session2.beginTransaction();
session2.merge(s1);
Объяснение
Как видно из строк 4–7, мы только что загрузили один объект s1 в кэш сеанса 1 и закрыли сеанс 1 в строке 7, поэтому теперь объект s1 в кеше сеанса 1 будет уничтожен, поскольку срок действия кеша сеанса 1 истечет, когда мы скажем session1.close()
.
Теперь объект s1 будет находиться в некотором месте в ОЗУ, а не в кеше session1. Здесь s1 находится в отдельном состоянии, и в строке номер 8 мы изменили этот отсоединенный объект s1, теперь, если мы вызовем метод update()
, то hibernate выдаст ошибку, потому что мы можем обновить объект только в сеансе.
Итак, мы открыли еще один сеанс [session2] в строке № 10 и снова загрузили тот же объект ученика из базы данных, но с именем s2. Итак, в этом сеансе2 мы назвали session2.merge(s1);
, теперь в объект s2 изменения s1 будут объединены и сохранены в базе данных