ホームページ  >  記事  >  Java  >  Hibernate で「同じ識別子を持つオブジェクトの重複」例外が発生するのはなぜですか?

Hibernate で「同じ識別子を持つオブジェクトの重複」例外が発生するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-28 22:16:02157ブラウズ

 Why am I getting a

Hibernate Exception: 同じ識別子を持つ重複オブジェクト

問題:

session.saveOrUpdate(e) を使用する場合他のエンティティとの関係があるオブジェクトの場合、「同じ識別子の値を持つ別のオブジェクトがすでにセッションに関連付けられている」ことを示す例外がスローされる場合があります。

説明:

この例外は、Hibernate が単一セッション内で同じ識別子を持つ同じエンティティの複数のインスタンスを検出した場合に発生します。この状況を簡略化して示します。

  • エンティティ A (rolebean) は、エンティティ B (userbean) およびエンティティ C (groupbean) に関連付けられています。
  • エンティティ B で saveOrUpdate を呼び出すと、 Hibernate はエンティティ A をエンティティ B の関係の一部として保存します。
  • その後、エンティティ C で saveOrUpdate を呼び出すと、Hibernate はエンティティ A を別のインスタンスとして再度保存しようとします。

解決策:

解決策は、目的の動作によって異なります:

1.マージによる関係の維持:

インスタンスの重複を防ぐには、saveOrUpdate の代わりに session.merge(e) を使用します。 Merge は、エンティティのデタッチされたインスタンス (この場合はエンティティ A) がセッションにアタッチされ、すべての変更がアタッチされたバージョンにマージされる必要があることを前提としています。

2.割り当ての一貫性を確保する:

saveOrUpdate の使用を継続する場合は、エンティティの同じインスタンスが関連するすべてのエンティティに割り当てられていることを確認してください。これは、エンティティ A をエンティティ B とエンティティ C の関係に追加する場合、エンティティ A の同じインスタンスを使用する必要があることを意味します。

例:

<code class="java">// Ensuring the same instance of rolebean is assigned to both userbean and groupbean
rolebean.setUserbean(userbean);
groupbean.getGroups().add(rolebean);</code>

注:

特定の修正は、割り当てを実行するコードによって異なります。オブジェクトの重複の問題を回避するには、リレーションシップを確立するときにエンティティの同じインスタンスが使用されていることを確認することが重要です。

以上がHibernate で「同じ識別子を持つオブジェクトの重複」例外が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。