org.hibernate.NonUniqueObjectException: a different object with the same identif
1026 ワード
セッションを使用します.merge(object)解決
例:
mergeとsaveorupdate()はいったいどんな違いがあるのでしょうか.コードを見てください.
上のコードを実行すると、hibernateは私たちにエラーを報告しました:a different object with the same identifier value was already associated with the session.セッションキャッシュで同じオブジェクトを2つ識別することはできません.では、updateをmergeに変更するとどうなるのでしょうか.mergeに変更後、すべてOKで正常に動作します.実はmergeは、更新を実行する前に2つの識別子が同じオブジェクトをマージします.具体的なマージの方向はexituser 2にマージします.注意:
mergeメソッドは、実行前にキャッシュに戻って、対応するレコードがあるかどうか、すなわちselect文があり、そのオブジェクトが変更されたかどうかを判断するために変更文を実行します.updateはこれらにかかわらず、直接update文です.
例:
mergeとsaveorupdate()はいったいどんな違いがあるのでしょうか.コードを見てください.
Session session = this.getSession();
Transaction tr = session.beginTransaction();
User exituser = (User)session.get(User.class, new Integer(1)); tr.commit();
session.close();
session = getSession();
tr = session.beginTransaction();
User exituser2 = (User)session.get(User.class, new Integer(1)); session.update(exituser);
tr.commit();
session.close();
上のコードを実行すると、hibernateは私たちにエラーを報告しました:a different object with the same identifier value was already associated with the session.セッションキャッシュで同じオブジェクトを2つ識別することはできません.では、updateをmergeに変更するとどうなるのでしょうか.mergeに変更後、すべてOKで正常に動作します.実はmergeは、更新を実行する前に2つの識別子が同じオブジェクトをマージします.具体的なマージの方向はexituser 2にマージします.注意:
mergeメソッドは、実行前にキャッシュに戻って、対応するレコードがあるかどうか、すなわちselect文があり、そのオブジェクトが変更されたかどうかを判断するために変更文を実行します.updateはこれらにかかわらず、直接update文です.