2013-12-17 4 views
2

Я работаю над веб-проектом, в котором я хочу обновить пользователя в базе данных. Во время написания кода я обнаружил, что он дает ошибку, если используется в качествеВ чем разница между getHibernateTemplate(). Update и getHibernateTemplate(). Merge

getHibernateTemplate() обновления (пользователя), что. «Незаконная попытка связать коллекцию с двумя открытыми сессиями;»

Но если я пробовал то же самое с использованием getHibernateTemplate().merge(user);, он отлично работал нормально. В чем разница между этими двумя? И что именно означает открытый сеанс?

ответ

7

Слияние может работать через сеансы, тогда как обновление работает только на ту же сессию.

Хотя оба они используются для преобразования объекта, находящегося в его состояние, чтобы преобразовать объект в его состояние, но обновление будет работать только в том случае, если мы находимся в одном сеансе, но слияние будет работать даже в случае его разного сеанса.

Подробнее info.

На открытой сессии, это означает, что вы в настоящее время выполнения операций в одной сессии (т.е. до закрытия сессии)

+0

+1 для ответа. –

+0

Hey aditya благодарит за ваш ответ, который очищает мою мысль о слиянии и обновлении – Nakul91

3

Всякий раз, когда вы пытаетесь загрузить тот же объект снова и снова в базу данных в этом случае обновление и слияние придет в картину.

В update(), если вы изменяете объект перед сохранением в базу данных, тогда hibernate выдает ошибку, потому что мы можем обновлять объект только в сеансе.

В merge() открытая сессия и предыдущий сеанс объединяются вместе, и объект будет сохранен в базе данных.

0

Оба метода update() и merge() в спящем режиме используются для преобразования объекта, находящегося в отключенном состоянии, в состояние сохранения. смотрите ниже кода:

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); 

* Выслушайте s1 находится в отдельном состоянии, теперь, если мы называем обновление() метод, то зимовать будет выдает ошибку, потому что мы можем обновить объект в сессии только

* Итак, мы открыли еще один сеанс [session2] и снова загрузили один и тот же объект-ученик из базы данных, но с именем s2

* поэтому в этом сеансе2 мы вызвали session2.merge (s1); теперь в s2 объект s1 изменения будут объединены и сохранены в базе данных

Смежные вопросы