Hibernate NonUniqueObjectException: 永続的な状態の競合の解決
Hibernate オブジェクトの保存中に org.hibernate.NonUniqueObjectException が発生すると、困惑することがあります。この例外は、永続化されているオブジェクトと同じ識別子を持つオブジェクトが既に現在のセッションに関連付けられていることが Hibernate によって検出された場合に発生します。
この問題に対処するには、Hibernate の永続的な状態管理を理解することが重要です。 Hibernate は、識別子の値に基づいてオブジェクトの永続的な状態を追跡します。複数のオブジェクトが同じ識別子を持つ場合、Hibernate はそれらが別個のインスタンスであっても、それらを同じオブジェクトであるとみなします。これにより、オブジェクトを保存または更新しようとすると競合が発生する可能性があります。
提供されたコード スニペットでは、userObj1 と userObj2 が同じ識別子の値を持っていることが明らかです。これは、カスケード保存または手動のオブジェクト操作が原因である可能性があります。この問題を解決するには、コードをトレースして識別子の衝突の原因を特定することが重要です。
考えられる原因の 1 つは、オブジェクトがまだアタッチされていないことを確認せずに session.save() メソッドを使用していることです。セッション。 Hibernate は、オブジェクトがまだ永続化されていない場合にのみオブジェクトを保存します。添付されたオブジェクトを保存しようとすると、例外が発生します。
もう 1 つの潜在的な問題は、主キー ジェネレーターに関連しています。特定のジェネレーターでは識別子の値を手動で割り当てる必要がある場合があり、これが正しく処理されないと競合が発生する可能性があります。
この例外が発生した場合は、次のことをお勧めします。
以上がHibernate の NonUniqueObjectException を解決する方法: 詳細ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。