Hibernate エラー: org.hibernate.NonUniqueObjectException: 同じ識別子の値を持つ別のオブジェクトがすでにセッションに関連付けられています 質問する

Hibernate エラー: org.hibernate.NonUniqueObjectException: 同じ識別子の値を持つ別のオブジェクトがすでにセッションに関連付けられています 質問する

2つのユーザーオブジェクトがあり、オブジェクトを保存しようとすると

session.save(userObj);

次のエラーが発生します:

Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
[com.pojo.rtrequests.User#com.pojo.rtrequests.User@d079b40b]

私はセッションを作成しています

BaseHibernateDAO dao = new BaseHibernateDAO();          

rtsession = dao.getSession(userData.getRegion(),
                           BaseHibernateDAO.RTREQUESTS_DATABASE_NAME);

rttrans = rtsession.beginTransaction();
rttrans.begin();

rtsession.save(userObj1);
rtsession.save(userObj2);

rtsession.flush();
rttrans.commit();

rtsession.close(); // in finally block

保存する前にも試してみましたがsession.clear()、それでもうまくいきませんでした。

これは、ユーザー リクエストが来たときにセッション オブジェクトを取得する初めてのケースです。そのため、オブジェクトがセッション内に存在すると表示される理由がわかります。

助言がありますか?

ベストアンサー1

このエラーは何度も発生しており、原因を突き止めるのは非常に困難です...

基本的に、Hibernate が言っているのは、同じ識別子 (同じ主キー) を持つ 2 つのオブジェクトがあるが、それらは同じオブジェクトではないということです。

コードを分解して、エラーがなくなるまで少しずつコメントアウトし、エラーが再発するまでコードを元に戻して、エラーを見つけることをお勧めします。

これは、オブジェクト A と B の間にカスケード保存があるカスケード保存を介して最もよく発生しますが、オブジェクト B は既にセッションに関連付けられていますが、A のオブジェクトと同じインスタンス B 上にはありません。

どのような主キージェネレータを使用していますか?

私が質問する理由は、このエラーが、オブジェクトの永続的な状態 (つまり、オブジェクトが永続的であるかどうか) を確認するように Hibernate に指示する方法に関連しているからです。Hibernate がすでに永続的なオブジェクトを永続化しようとしているために、このエラーが発生している可能性があります。実際、save を使用すると、Hibernate はそのオブジェクトを永続化しようとしますが、セッションに関連付けられた同じ主キーを持つオブジェクトがすでに存在している可能性があります。

主キーの組み合わせ (列 1 と列 2) に基づいて 10 行のテーブル用の Hibernate クラス オブジェクトがあるとします。ここで、ある時点でテーブルから 5 行を削除しました。ここで、同じ 10 行を再度追加しようとすると、Hibernate がデータベース内のオブジェクトを永続化しようとしている間に、すでに削除されている 5 行がエラーなしで追加されます。この時点で、すでに存在している残りの 5 行は、この例外をスローします。

したがって、簡単な方法は、何かの一部であるテーブル内の値を更新/削除したかどうかを確認し、後で同じオブジェクトを再度挿入しようとしているかどうかを確認することです。

おすすめ記事