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