ホームページ  >  記事  >  Java  >  Hibernate: 多対多の関係を扱うときに「saveOrUpdate」が「NonUniqueObjectException」をスローするのはなぜですか?

Hibernate: 多対多の関係を扱うときに「saveOrUpdate」が「NonUniqueObjectException」をスローするのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-28 18:53:02854ブラウズ

 Hibernate: Why Does `saveOrUpdate` Throw `NonUniqueObjectException` When Working with Many-to-Many Relationships?

休止状態: 同じ ID の複数のオブジェクトによる混乱

問題:

を試みたときHibernate の saveOrUpdate メソッドを使用してオブジェクトを保存または更新すると、例外がスローされます:

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

コンテキスト:

この問題は、RoleBean などのオブジェクトが同じトランザクション内で UserBean や GroupBean などの複数のエンティティに割り当てられるときに発生します。これは、オブジェクトに多対多の関係がある場合に発生する可能性があります。

たとえば、指定されたシナリオでは、RoleBean#1 は最初に GroupBean#1 に割り当てられます。同じセッション内で UserBean#1 に追加しようとすると、例外が発生します。

解決策:

例外の原因は、2 つの異なるものが存在することです。セッション内のRoleBeanオブジェクトのインスタンス。 1 つのインスタンスは UserBean に直接関連付けられ、もう 1 つは GroupBean を通じて間接的に関連付けられます。

この問題を解決するには、次のオプションを検討してください:

  1. 代わりにマージを使用してください。 saveOrUpdate の: マージ操作では、ID に関係なく、Hibernate によって返されたデタッチされたインスタンスに加えられた変更はデータベースにマージし戻される必要があると想定されます。ただし、その間にターゲット オブジェクトが変更されている場合は、マージによってデータ損失が発生する可能性があります。
  2. トランザクション全体を通じて、RoleBean の同じインスタンスが使用されていることを確認してください。 これは、慎重に行うことで実現できます。 UserBean と GroupBean の両方に正しいインスタンスを割り当てます。単一のインスタンスを維持することで、重複オブジェクトの作成を回避できます。
  3. JPA のマージ メソッドの使用を検討してください: JPA は、Hibernate のマージと同様に動作するマージ メソッドを提供します。デタッチされたインスタンスに加えられた変更はすべてデータベースにマージし直される必要があることを前提としています。

これらのアプローチのいずれかを実装することで、例外を解決し、同じ ID を持つオブジェクトが適切に処理されるようにすることができます。単一の Hibernate セッション内。

以上がHibernate: 多対多の関係を扱うときに「saveOrUpdate」が「NonUniqueObjectException」をスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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