1. ホーム
  2. java

[解決済み】Hibernateエラー:同じ識別子値を持つ別のオブジェクトがすでにセッションに関連付けられました。

2022-01-17 22:29:50

質問

私は基本的にこの構成でいくつかのオブジェクトを持っています(実際のデータモデルはもう少し複雑です)。

  • AはBと多対多の関係(Bは inverse="true" )
  • BはCと多対一の関係にある(私は cascade に設定します。 "save-update" )
  • Cはタイプ/カテゴリーテーブルの一種です。

また、主キーは保存時にデータベースによって生成されることを述べておく必要があるでしょう。

私のデータでは、Aが異なるBオブジェクトのセットを持っていて、これらのBオブジェクトが同じCオブジェクトを参照しているという問題に遭遇することがあります。

を呼び出すと session.saveOrUpdate(myAObject) というハイバーネートエラーが発生します。 "a different object with the same identifier value was already associated with the session: C" . hibernateは同じセッションで同じオブジェクトを2回挿入/更新/削除できないことは知っていますが、これを回避する方法はあるのでしょうか?そんなに珍しい状況でもないような気がするのですが。

この問題を調査している間、私は、多くの人が session.merge() しかし、そうすると、すべての値がnullに設定された空白のオブジェクトとしてデータベースに挿入されます。これは明らかに、私たちが望んでいるものではありません。

[編集] もうひとつ言い忘れたのは、(私の手に負えないアーキテクチャ上の理由で)読み取りや書き込みはそれぞれ別のセッションで行う必要があるということです。

解決方法は?

おそらく、Bオブジェクトが同じJava Cオブジェクトのインスタンスを参照していないことが原因でしょう。それらはデータベースの同じ行(すなわち同じ主キー)を参照していますが、そのコピーは異なっています。

つまり、エンティティを管理しているHibernateセッションは、同じ主キーを持つ行に対応するJavaオブジェクトを追跡していることになります。

1つのオプションは、同じ行を参照するオブジェクトBのエンティティが、実際にはCの同じオブジェクトインスタンスを参照していることを確認することです。この方法では、Bが永続化されたとき、Cは永続化されません。ただし、Cを別途手動で保存する必要があります。Cがタイプ/カテゴリ・テーブルである場合、おそらくそのようにすることが理にかなっています。