Hibernate EntityManager.merge () приводит к созданию новой сущности вместо обновления существующей - PullRequest
4 голосов
/ 20 февраля 2011

У меня есть следующая (частичная) иерархия: @MappedSuperclass public abstract class PersistentEntity { @Id @GeneratedValue(generator="system-uuid") @Type(type = "pg-uuid") public UUID getId() { return id; } }</p> <p>@Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING) public abstract class AbstractCredential extends PersistentEntity { //content }</p> <p>@Entity @DiscriminatorValue("Standard") @PrimaryKeyJoinColumn(name = "ID") public class StandardCredential extends AbstractCredential { //hashcode and quals here, by full data }

AbstractCredential является сущностью, а не @MappedSuperclass, так что я могу выбрать из нее по id и получить соответствующий «конкретный» класс. моя проблема заключается в том, что если я создаю новый (отсоединенный) экземпляр с идентификатором существующего экземпляра, а затем передаю этот отсоединенный экземпляр для слияния, hibernate создает новую сущность (то есть генерирует новый идентификатор и переопределяет поле идентификатора в моем вновь созданный экземпляр). Насколько я понимаю, Hibernate должен был переопределить все поля в существующем экземпляре со значениями в моем отдельном экземпляре.

что я делаю не так?

1 Ответ

4 голосов
/ 20 февраля 2011

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

Эта диаграмма ясно показывает, что сущность в состоянии New / Transient-состоянии отличается от Detached (JPA). Здесь Hibernate (3.5) ручной ввод для состояний сущностей. Я также проверил из книг «Сохранение Java с JPA» - и «Сохранение Spring с Hibernate» - оба объясняют состояния сущности и переходы аналогично (отсоединенная сущность должна быть сохранена в / извлечена из базы данных, а затем отсоединена от контекста / сеанса постоянства. стать отстраненным). К сожалению, я не смог найти упоминаний о том, как должно происходить слияние в случае, когда вы создаете новый объект с помощью new и назначаете ему идентификатор вручную, что заставляет меня поверить, что merge не должен использоваться таким образом. Тем не менее, может быть не так.

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