Я провел некоторое пробное тестирование, чтобы записать разницу между Save () и Persist ().
Похоже, что оба этих метода ведут себя одинаково при работе с Transient Entity, но различаются при работе с Detached Entity.
Для приведенного ниже примера возьмите EmployeeVehicle в качестве сущности с PK в качестве vehicleId, который является сгенерированным значением, и vehicleName в качестве одного из его свойств.
Пример 1: Работа с временным объектом
Session session = factory.openSession();
session.beginTransaction();
EmployeeVehicle entity = new EmployeeVehicle();
entity.setVehicleName("Honda");
session.save(entity);
// session.persist(entity);
session.getTransaction().commit();
session.close();
Результат: select nextval ('hibernate_sequence')
// Это для сгенерированного идентификатора транспортного средства: 36
insert into Employee_Vehicle ( Vehicle_Name, Vehicle_Id) values ( Honda, 36)
Repeat the same with using persist(entity) and will result the same with new Id ( say 37 , honda ) ;
Пример 2. Работа с отдельным объектом
// Session 1
// Get the previously saved Vehicle Entity
Session session = factory.openSession();
session.beginTransaction();
EmployeeVehicle entity = (EmployeeVehicle)session.get(EmployeeVehicle.class, 36);
session.close();
// Session 2
// Here in Session 2 , vehicle entity obtained in previous session is a detached object and now we will try to save / persist it
(i) Using Save() to persist a detached object
Session session2 = factory.openSession();
session2.beginTransaction();
entity.setVehicleName("Toyota");
session2.save(entity);
session2.getTransaction().commit();
session2.close();
Результат: Возможно, вы ожидаете автомобильс идентификатором: 36, полученным в предыдущей сессии, обновляется с именем «Тойота».Но происходит то, что новый объект сохраняется в БД с новым идентификатором, сгенерированным для, и именуется как «Toyota»
select nextval ('hibernate_sequence')
insert into Employee_Vehicle ( Vehicle_Name, Vehicle_Id) values ( Toyota, 39)
(ii) Using Persist() to persist a detached object
// Session 1
Session session = factory.openSession();
session.beginTransaction();
EmployeeVehicle entity = EmployeeVehicle)session.get(EmployeeVehicle.class, 36);
session.close();
// Сессия 2 // Здесь в Сессии 2, объект транспортного средства, полученный в предыдущем сеансеявляется отсоединенным объектом, и теперь мы попытаемся сохранить / сохранить его (i) Использование persist () для сохранения отсоединенного объекта
Session session2 = factory.openSession();
session2.beginTransaction();
entity.setVehicleName("Toyota");
session2.persist(entity);
session2.getTransaction().commit();
session2.close();
Результат: генерируется исключение: отсоединенная сущность передана для сохранения
Таким образом, всегда лучше использовать Persist (), а не Save (), поскольку при работе с сессиями и транскрипцией необходимо тщательно использовать save.