Hibernate метод сеанса для обновления объекта - PullRequest
2 голосов
/ 05 апреля 2010

Мне нужна эта дорожная карта экземпляра управляемого объекта Hibernate.

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

Какие методы сессии Hibernate мне следует использовать? persist () или save () на первом шаге и saveOrUpdate () на втором?

На самом деле я вижу, что saveOrUpdate () может использоваться на каждом шаге. Единственная проблема в том, что, как я вижу, он не возвращает связанный PK. Знаете ли вы, как получить его, когда мы сохраняем объект для первый раз? Я полагаю, после того, как мы сохраним объект, он получит установленное поле id, поэтому после вызова saveOrUpdate (myObject) myObject.getId () возвращает PK?

Что бы вы порекомендовали?

Ответы [ 2 ]

4 голосов
/ 05 апреля 2010

Если я понимаю вашу проблему, вы хотите присоединить временный объект к новому сеансу гибернации. Тогда вы должны использовать Session.merge (объект)

слияния

Объединение объектов (Object object) выдает HibernateException

Копировать состояние данного объекта на постоянный объект с тот же идентификатор. Если нет постоянный экземпляр в настоящее время связанный с сеансом, он будет быть загруженным. Вернуть постоянное пример. Если данный экземпляр несохраненные, сохраните копию и верните ее как новый настойчивый экземпляр. данный экземпляр не становится связан с сеансом. это каскады операций к связанным случаи, если сопоставление сопоставлено with cascade = "merge".

2 голосов
/ 05 апреля 2010

Из спящего режима Документация :

Transient - объект является временным, если он был создан с использованием оператора new и не связан с Hibernate Session. Он не имеет постоянного представления в базе данных, и значение идентификатора не было назначено. Временные экземпляры будут уничтожены сборщиком мусора, если приложение больше не будет содержать ссылку. Используйте сеанс Hibernate, чтобы сделать объект постоянным (и пусть Hibernate позаботится о операторах SQL, которые должны быть выполнены для этого перехода).

Detached - отсоединенный экземпляр - это объект, который был постоянным, но его Сессия была закрыта. Разумеется, ссылка на объект все еще действительна, и отсоединенный экземпляр может даже измениться в этом состоянии. Отдельный экземпляр может быть снова присоединен к новому сеансу позднее, что делает его (и все модификации) снова постоянным. Эта функция позволяет модели программирования для длительных единиц работы, которые требуют времени на обдумывание пользователем. Мы называем их прикладными транзакциями, то есть единицей работы с точки зрения пользователя.

По этим определениям ваш объект изначально будет временным. Вы должны использовать persist, чтобы сохранить его в базе данных, делая его постоянным до закрытия сеанса. После этого я понимаю, что объект будет считаться отдельным, то есть вы можете изменить его по своему желанию и merge с помощью нового сеанса: obj = entityManager.merge(obj)

Разница в том, что persist изменяет объект, который вы предоставляете в качестве параметра, и предназначен для первоначального сохранения нового объекта, в то время как merge возвращает измененный экземпляр (а не изменяет переданный в качестве параметра) и предназначен для разрешить обновление.

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