2

現在のページのエンティティ オブジェクトのリストを持つマネージド Bean があります。新しいオブジェクトを作成し、トランザクションで persist() を使用してデータベースに永続化した後。マージを呼び出すときの別のトランザクションで(以前のトランザクションコミットのためにエンティティが切り離された状態になっているため); entitymanager は永続コンテキストでオブジェクトを見つけることができず、選択クエリをデータベースにスローします。私は何かを見逃していますか、それともそれは正常な動作ですか?

更新: mysql データベースと自動生成された Id 列を使用すると、上記の問題が発生します。IDにシーケンスを使用するOracleを使用する場合、それは存在しません。それでも; 永続化コンテキストは、生成された ID を認識している必要があります。また、永続コンテキストを覗いて、どのエンティティが終了するかを確認する方法はありますか。私は休止状態を使用しています

4

2 に答える 2

1

これは正常な動作です。永続コンテキストは、デフォルトでトランザクションの存続期間が同じです。そして、それは完全に正常です。トランザクションがコミットされると、他のトランザクションがエンティティを変更する可能性があり、Hibernate はデータベースからエンティティをリロードして、古い値を返さないようにする必要があります。

于 2012-11-02T08:12:54.620 に答える
1

これは正常な動作です。インスタンスが永続化コンテキストにない場合、インスタンスが存在するかどうかを知る必要があります (後で上書きするか、新しく作成する必要があります)。

ID 生成: 生成された ID は通常、persist(..) の呼び出し時に返されます。これは非常に便利なため、アプリケーションは新しく作成された ID をすぐに使用でき、トランザクションの終了を待つ必要はありません。

特定のオブジェクトが永続化コンテキストにあるかどうかを確認するには、 https ://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html#contains%28java.lang.Object%29 を呼び出します。

于 2012-11-02T08:13:32.673 に答える