Подтвердить что ты не робот

Различия между save, update, saveOrUpdate, методами объединения в сеансе?

Я новичок в Hibernate и на прошлой неделе прошел учебник Hibernate. У меня есть несколько сомнений в том, как сохранять, обновлять, сохранятьOrUpdate и объединять класс Session. Это:

  • метод сохранения: используется для вставки вновь созданного объекта в хранилище данных. (В основном для этого значения идентификатора будет 0). Подобно тому, как я создаю новый клиент и выполняю операцию сохранения вызова, он будет сохраняться в хранилище данных и генерировать идентификатор.

    Это правильно? И если мы вызываем save на уже устойчивом объекте, не уверены, что произойдет?

  • метод обновления: он используется для обновления уже сохраняющегося объекта в хранилище данных (в основном для значения идентификатора будет какое-то ненулевое значение). Как и я загружаю нового клиента и вызываю операцию обновления после обновления некоторого значения поля, он обновит его в хранилище данных.

    В соответствии с моим пониманием, это должно сработать с некоторым исключением, поскольку обновление API для отдельного объекта. Это верно? Если да, то что мы должны вызвать для обновления объекта в том же сеансе (я имею в виду, если объект не отсоединен). Еще один момент: что произойдет, если мы будем называть обновление для вновь созданного объекта?

  • метод saveOrUpdate: он будет вызывать любой из вышеперечисленных основанных на проверках несохраненных значений (которые он должен делать на основе идентификатора нуля или ненулевого значения, правильно?), поэтому, если у нас есть постоянный объект клиента, и мы обновляем его фамилию и создаем новую учетную запись, тогда saveOrUpdate позаботится об этом.

    Я правильно понял это?

  • Метод слияния: он будет действовать как обновление, но здесь, если постоянный объект с тем же идентификатором уже находится в сеансе, он обновит значения отдельных объектов в постоянном объекте и сохранит его,

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

    Я также получил это?

4b9b3361

Ответ 1

Вы полностью правы во всех своих оценках. Вы его получите.

Для вашего первого вопроса, если я правильно напомню, save специально вставляет. Поэтому вызов save снова приведет к другой строке в db.

Для вашего второго вопроса update обновляет объект в сеансе. Поэтому, если объект находится в сеансе, он будет обновляться. Если объект не находится в сеансе, вы должны вызвать слияние. Я считаю, что вызов update для отдельного экземпляра приведет к исключению.

Ответ 2

У вас есть все, что нужно, но обновление работает немного иначе, чем вы его описывали. Если объект находится в сеансе (т.е. Постоянный), обновление совершенно не нужно. Hibernate обрабатывает любые изменения объектов в сеансе при очистке сеанса. Вызов обновления на них ничего не сделает (и может привести к штрафу за производительность, я не уверен).

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

Так часто можно избежать вызова update/merge вообще, но если вы в конечном итоге должны его вызвать, merge обрабатывает более широкий диапазон ситуаций. Мое понимание - единственная причина использования обновления для повышения производительности, если вы знаете, что это не будет ошибкой.

Этот поток содержит довольно хорошее резюме некоторых других методов спящего режима.

Изменить: я просто подумал, что должен сказать, что между слиянием и обновлением больше различий, чем я изначально сказал. Обновление изменяет данный объект на постоянный, тогда как merge возвращает новый постоянный объект. Для слияния вы должны выбросить старый объект. Еще одно отличие заключается в том, что слияние выполняет грязную проверку, выбирая из БД, прежде чем решать, записывать ли данные, тогда как обновление всегда сохраняет свои данные в БД независимо от того, грязно или нет.

Возможно, существуют и другие небольшие различия. Всегда полезно проверить поведение Hibernate, зарегистрировав сгенерированный SQL, потому что поведение не всегда соответствует документам, по крайней мере, по моему опыту.

Ответ 3

@Naliba дал отличный ответ по методу Update().

Жизненный цикл гибернации в следующем изображении помогает получить представление выше методов.

введите описание изображения здесь

Пример: Посмотрим, как выглядит метод merge().

SessionFactory factory = cfg.buildSessionFactory();
Session session1 = factory.openSession();

Student student1 = null;
Object object1 = session1.get(Student.class, new Integer(101));
student1 = (Student)object1;
session1.close();

student1.setMarks(97);// -->object will be in some RAM location, not in the session1 cache

Session session2 = factory.openSession();
Student student2 = null;
Object object2 = session2.get(Student.class, new Integer(101));
student2 = (Student)object2;
Transaction tx=session2.beginTransaction();

session2.merge(student1);

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

В этом session2 мы вызвали session2.merge(s1); теперь в student2 object student1 изменения будут объединены и сохранены в базе данных.

Ответ 4

session.update() - используется для сценария, когда вы загружаете объект Person1 из сеанса спящего режима. Теперь он используется в приложении - также может быть на стороне клиента, был обновлен. Мы хотим сохранить его снова. Мы знаем, что никаких изменений в объекте Person в базе данных не было. Поэтому мы можем просто использовать обновление.

session.merge() - В приведенном выше сценарии, если изменения были сделаны в личных данных перед сохранением измененного объекта Person1, тогда мы должны использовать слияние. Он объединит изменения.

session.save() - его можно использовать для сохранения нового объекта. Он возвращает сериализуемое удостоверение.

session.persist() - То же, что и save(), но является недействительным и ничего не возвращает.

session.saveOrUpdate() - этот метод будет работать как для новых, так и для старых объектов. Если объект новый, он будет работать как простое сохранение или если объект уже настойчив, он будет работать как обновление.

session.lock() - используется только для блокировки объекта или вы можете сказать, чтобы проверить версию объекта. Он не предназначен для обновления объекта. Он должен использоваться для повторного подключения объекта, только если вы уверены, что состояние объекта в базе данных уже не изменено. В противном случае он может переопределить изменения. < Приглашение на это больше.

Ответ 5

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

Ответ 6

Слияние происходит ниже

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

  • Если объект является временным, он просто запускает запрос INSERT, делает объект постоянным (прикрепленным к сеансу)
  • если объект отсоединен, запускает запрос выбора, чтобы проверить, были ли изменены данные или нет если он изменен, запускает запрос UPDATE, иначе просто игнорирует задачу слияния.

где в качестве session.update

  • выдает исключение, если объект является временным.
  • Если объект отсоединен, он просто запускает запрос UPDATE независимо от изменений данных в объекте.

session.merge дороже обновления

Ответ 7

Вы должны применить разницу между методами save() и saveOrUpdate в своем коде, чтобы получить максимальную производительность:

Метод save() возвращает идентификатор, сгенерированный базой данных. С другой стороны, saveOrUpdate() может выполнять INSERT или UPDATE в зависимости от того, существует ли объект в базе данных или нет. И saveOrUpdate делает выбор сначала, чтобы определить, нужно ли ему вставлять или обновлять. Поэтому вы должны использовать saveOrUpdate в случае запроса на обновление.

Другое ключевое различие между методом save() и saveOrUpdate() заключается в том, что метод save() используется для того, чтобы сделать переходный объект в постоянное состояние, но saveOurUpdate() может создавать объект как переходный (новый объект), так и отдельный объект (существующий объект) в постоянное состояние. Так что saveOrUpdate() часто используется для повторного прикрепления отдельного объекта к сеансу.

Из сообщения Разница между save и saveOrUpdate в спящем режиме

Ответ 8

Этот пост всегда помогает мне легко пересмотреть эти концепции.