2

通常の Foo エンティティがあり、persist(foo) を呼び出すと、エンティティに @Id が自動的に設定されます。ただし、上記の Foo エンティティに Bars のコレクションがバインドされている場合は、

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

新しい Bar を作成して foo の Bars コレクションに追加し、merge(foo) を呼び出すと、作成したばかりの Bar は永続化されますが、その @Id は更新されません!

後で find(Foo.class, foo.getId()) を呼び出さずに、この ID を取得する方法はありますか?

4

1 に答える 1

0

merge() を呼び出しても、渡されたオブジェクトは更新されません。ただし、更新されたオブジェクトが返されます。

休止状態のドキュメントから:

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

そして、merge() は大きく異なります。

  • 現在セッションに関連付けられている同じ識別子を持つ永続インスタンスがある場合、指定されたオブジェクトの状態を永続インスタンスにコピーします
  • 現在セッションに関連付けられている永続インスタンスがない場合は、データベースからロードするか、新しい永続インスタンスを作成してください
  • 永続的なインスタンスが返されます
  • 指定されたインスタンスはセッションに関連付けられず、切り離されたままになります
于 2008-12-05T23:02:12.817 に答える