3

私はしばらくの間Hibernateを使用しており、一般的なエラーメッセージのほとんどに慣れています。ほとんどの人が私に問題を直接指摘しますが、私はこれに問題を抱えています:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session

エラーは理解していますが(セッションには同じIDを持つ2つの異なるオブジェクトがあります)、コードをデバッグして問題の原因を見つける良い方法がわかりません。通常、私は現在変更しているコードを見て、ロジックに単純なエラーが見つかることを期待して、あるオブジェクトをロードして別のオブジェクトを手動で作成する場所を探します。しかし、私は現在、自分が書いたものではなく、なじみがなく、ドキュメントがないコードセットを使用しています。私が考えることができる唯一の解決策は、エラーを見つけることを期待して、コードを1行ずつ調べることです。このエラーをデバッグするためのより良い方法を知っていますか?

さらに、私が得ている正確なエラーは、への呼び出しからのものであり、それがいつ呼び出すべきかをsaveOrUpdate()呼び出しているのかどうか疑問に思います。デバッグの目的で、Hibernateが現在のセッションにあるオブジェクトを確認する方法はありますか?save()update()

4

2 に答える 2

4

saveOrUpdateupdateデタッチされたエンティティがすでにIDを持っている場合に呼び出します。update次に、指定されたデタッチされたエンティティをセッションにアタッチしようとします。セッションには特定のエンティティのインスタンスを1つしか含めることができないため、呼び出されたときにセッションにエンティティを(、、、またはクエリを使用して)すでにロードしているload場合getsaveOrUpdate、この例外が発生します。

saveOrUpdate通常、セッションを開いた後、最初に行うことの1つである必要があります。エンティティを更新する前にロードする必要がある場合は、を使用する必要がありますmergemergeエラーが発生しにくいため、通常はすべての場合に使用することをお勧めします。

を使用して、セッションの内容を把握できますsession.getStatistics().getEntityKeys()

于 2011-10-28T20:01:11.040 に答える
1

Session.Flush関数にブレークポイントを設定し、どのオブジェクトがパーシスターに格納されているかを確認することもできます。ここでは、セッション開始イベントとセッション終了イベントを追跡する方法についての情報を見つけることができます。おそらく、オブジェクトとイベントのPersistenceContextプロパティを注意深く調べる必要があります。SessionImplOnFlush

ソースコードを使用してデバッグするために、すべてのNHibernateソースを再コンパイルする必要はありません。pdbファイルをzipソースファイルにバインドできます(http://lowleveldesign.wordpress.com/2011/10/02/debuggingを参照してください)。 -nhibernate-prepare-symbol-files /)。

于 2011-10-30T09:25:42.153 に答える