Как получить Id объекта, сохраненного через каскад с JPA - PullRequest
1 голос
/ 06 декабря 2008

Если у вас есть обычная сущность Foo и вызов persist (foo), @Id автоматически устанавливается на сущность. Однако, если у указанной сущности Foo есть коллекция Bars, связанная с ней через

(...)
@OneToMany(cascade=Cascade.ALL) 
Set<Bar> getBars()
(...)

и такой экземпляр уже сохраняется, если создать новый Bar и добавить его в коллекцию fars Boos и вызвать merge (foo), только что созданный Bar сохраняется, но его @Id не обновляется!

Есть ли способ получить этот идентификатор, не делая более позднего вызова для поиска (Foo.class, foo.getId ())?

1 Ответ

0 голосов
/ 06 декабря 2008

Вызов merge () не обновит переданные объекты. Однако он вернет обновленные объекты.

Из документов гибернации:

http://www.hibernate.org/hib_docs/v3/reference/en/html/objectstate-saveorupdate.html

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

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