Еще несколько объяснений слияния Hibernate - PullRequest
0 голосов
/ 01 июня 2011

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

Есть ли способ использовать слияние на транзиторной сущности?

Ответы [ 2 ]

3 голосов
/ 02 июня 2011

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

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

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

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

Слияние - это способ сказать Hibernate: «Я хочу, чтобы вы предполагали, что любые изменения, внесенные мной в эту сущность Hibernate, должны быть сохранены, даже если я внес их в другой экземпляр объекта, чем тот, о котором я вас просилсохранить."SaveOrUpdate - это способ сказать Hibernate быть более консервативным и вместо этого выдать исключение.

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

0 голосов
/ 01 июня 2011

это выглядит только в текущем сеансе гибернации, а не во всех сеансах гибернации.

для вашего второго вопроса вы не можете по определению «переходный» (то, что, как я полагаю, вы имели в виду, а не «постоянный»). Переходный процесс означает, что объект не был сохранен. Слияние означает ничего не слышать.

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