2014-10-22 2 views
1

В спящем режиме session.save() должен сохранять записи. Он генерирует «вставить» запросы. Тем не менее, я написал ниже простую программу, чтобы проверить это. Я наблюдаю, что save() также может использоваться для обновления записей. Он генерирует запрос «update». Не сохраняет() выполнение той же работы, что и saveorupdate() в нижеприведенной программе?Почему Hibernate Save обновляет записи?

SessionFactory sf = conf.buildSessionFactory(); 
Session session = sf.openSession(); 
Transaction trans = session.beginTransaction(); 

Vehicle veh = new Vehicle(); 
veh.setId(1); 
veh.setModel("Veh_mod"); 
veh.setName("Veh_Name"); 

Serializable obj = session.save(veh); 
veh.setModel("Veh_mod_change"); 

obj = session.save(veh); 

session.flush(); 
trans.commit(); 
session.close(); 

------------------------- в консоли --------------- -----------------

гибернации: /* вставить com.anvesh.test.Vehicle */вставки в АВТОМОБИЛЯ (ИМЯ, МОДЕЛЬ, ИД) значения

Hibernate (,??): /* обновление com.anvesh.test.Vehicle */обновление ТРАНСПОРТНЫЕ СРЕДСТВА комплект ИМЯ = ?, МОДЕЛЬ =? где ID =?

ответ

0

Когда вы впервые вызвали session.save (veh), ваш объект будет связан с сеансом. Hibernate тогда узнает, что при повторном сохранении объекта ему необходимо использовать запрос «UPDATE».

Try:

Vehicle veh1 = new Vehicle(); 
veh1.setId(1); 
veh1.setModel("Veh_mod"); 
veh1.setName("Veh_Name"); 

Vehicle veh2 = new Vehicle(); 
veh2.setId(1); 
veh2.setModel("Veh_mod"); 
veh2.setName("Veh_Name"); 

session1.save(veh1); 
session2.save(veh2); // try changing this to session2.saveOrUpdate() 

, то вы увидите разницу между session.save() и Session.saveOrUpdate()

+0

@ gmarintes..Спасибо за ваш ответ. Когда я попробовал вышеуказанный фрагмент кода, у меня есть org.hibernate.NonUniqueObjectException. Затем я заменил save() с saveOrUpdate() в последних двух операторах. даже тогда я получил org.hibernate.NonUniqueObjectException. Так что любезно дайте мне знать, какую разницу мы можем вывести/разглядеть между save и saveOrUpdate() в предыдущем фрагменте кода. – Anveshan

+0

Я забыл, что вам нужно попробовать его на двух разных сеансах. Я редактировал код выше. – gmarintes

1

После первого вызова save(), объект veh становится приложенный объект (aka. состояние постоянных объектов). Впоследствии мутация этого объекта с помощью setModel() и совершение транзакции заставит спящий режим запускать обновление даже без вызова save() во второй раз.

Вот пример для сравнения: http://www.dineshonjava.com/p/transient-persistent-and-detached.html#.VEfGCme8G7E

Или возможно короткие видео-учебник: http://javabrains.koushik.org/tutorials/hibernate_run/Hibernate-Tutorial-22---Transient,-Persistent-and-Detached-Objects.html

1

save() может сделать обновление, если идентификатор установлен на объекте он экономит. Проверьте this thread на наличие различий между различными методами экономии. Цитировать из принятого ответа

save Сохраняет юридическое лицо. Будет присвоен идентификатор, если он не существует. Если это так, то это по сути делает обновление. Возвращает сгенерированный идентификатор объекта.

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