ネストされたコレクションを持つユーザー Bean を保存するときに、Hibernate が「同じ識別子の値を持つ別のオブジェクトがすでにセッションに関連付けられています」という例外をスローするのはなぜですか、またその方法は次のとおりです。

Susan Sarandon
リリース: 2024-10-30 16:08:02
オリジナル
302 人が閲覧しました

Why does Hibernate throw the

Hibernate: 重複したオブジェクト識別子による例外処理

エラー メッセージ「Hibernate: 同じ識別子の値を持つ別のオブジェクトが既に関連付けられています。 「セッション」は、Hibernate が現在のセッションにすでに関連付けられている既存の識別子を持つオブジェクトを検出したときに発生します。これは、セッション内にすでに存在するオブジェクトを保存または更新しようとすると競合が発生する場合に発生する可能性があります。

提供されたコード内:

<code class="java">public E save(E e) {
    Session session = null;
    try {
        session = sessionFactory.openSession();
        log.debug("session="+session.hashCode()+" save "+e);
        session.saveOrUpdate(e);  //here throws exception 
        session.flush();
    }
    catch (Exception e1) {
        log.err("Cannot open hibernate session "+ e1.getMessage()+" cause : "+e1.getCause());
        e1.printStackTrace();
    }
    finally { if ( session != null ) session.close(); session = null;}
    return e ;
}</code>
ログイン後にコピー

試行時に例外がスローされます。ユーザー Bean を保存または更新します。この問題の原因は、ユーザー Bean にグループ Bean のリストが含まれており、グループ Bean にはロールのリストがあることが考えられます。ユーザー Bean を保存するとき、Hibernate はロールを 2 回保存しようとします。1 回目はグループ Bean の一部として、もう 1 回はユーザー Bean のロール リストの一部としてです。

userbean#1
|---|-----------***userbean.groups
|     |     groupbean#1
|     |         groupbean.roles
|     |             rolebean#1  # save relebean#1 the first time
|     |             ---done rolebean#1
|     |         ------done all rolebeans of group.roles
|     |     ---done groupbean#1
|     |-----------done all groupbeans of userbean.groups
|---|-----------***userbean.roles
     |      rolebean#1          # save rolebean#1 the second time, and throws exception here!
     |      ----done rolebean#1
     |      .....
     |-----------done all rolebeans of userbean.roles
ログイン後にコピー

この問題を解決するには、次のアプローチを検討してください。 :

  • session.saveOrUpdate()** の代わりに session.merge() を使用します**: これにより、オブジェクトがすでに管理されており、管理する必要があることが Hibernate に伝えられます。
  • 保存または更新する前に、オブジェクトがセッションにアタッチされていることを確認してください: これは、session.load() または session を使用して実現できます。 .get() はデータベースからオブジェクトを取得します。

以上がネストされたコレクションを持つユーザー Bean を保存するときに、Hibernate が「同じ識別子の値を持つ別のオブジェクトがすでにセッションに関連付けられています」という例外をスローするのはなぜですか、またその方法は次のとおりです。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!