спящий режим: объединить и сохранитьOrUpdate - PullRequest
3 голосов
/ 15 марта 2011

Я работаю над приложением spring-hibernate-envers. После многих поисков в Google все, наконец, работает для меня, но у меня все еще есть пара вопросов.

  1. Ранее я использовал saveOrUpdate для сохранение или обновление сущностей. Но при работе с энверсом это было бросая nonUniqueObject исключение. Поэтому я использовал merge вместо и это сработало. Правильно ли использовать слить за это? merge вставки новые объекты в БД?

  2. Я попробовал следующий код:

entity=merge(entity);  
saveOrUpdate(entity);

Это тоже сработало. Это правильный путь? А также мне любопытно, почему saveOrUpdate не выдает никакой ошибки сейчас.

Ответы [ 2 ]

10 голосов
/ 15 марта 2011

Hibernate Ссылка говорит:

saveOrUpdate () выполняет следующие действия:

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

и merge () очень разные:

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

Это означает, что вы можете использовать saveOrUpdate(), если уверены, что объект с таким же идентификатором не связан с сеансом. В противном случае вы должны использовать merge().

следующий код

entity=merge(entity);
saveOrUpdate(entity); 

работает, потому что результат merge() является постоянным объектом, поэтому он игнорируется saveOrUpdate(), так что вторая строка не имеет никакого смысла.

0 голосов
/ 15 марта 2011

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

merge: Hibernate сначала проверит, существует ли постоянный экземпляр этого типа в постоянном контексте.Он использует идентификаторы объекта для проверки этого существования.Если существует другой экземпляр, он копирует состояние объекта Detached в существующий объект Persistence.Если другого экземпляра не существует, Hibernate просто повторно присоединяет объект Detached.

Если сеанс содержит более одной копии одной сущности, обновите всю копию до последней сущности. Он не будет обновляться в базе данных, пока вы не вызовете update.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...