mergeとupdateの違い
まず問題外の話をして、次のコードに驚きました.
基本的には簡単で簡単ではありませんが、驚いたことに、私は現実的な呼び出しセッションを持っていません.updateとか、自動更新してくれたなんて...どうしてか本当に分からない.
答え:updateは脱管状態のオブジェクトを操作し、flushは持続状態のオブジェクトを操作します.
余談ですが、本題に入りましょう.セッションごとに同じoidに1つの永続状態のオブジェクトしか対応できません.oidのオブジェクトに複数のオブジェクトがあると、例外が発生します.NonUniqueObjectException
例えば次の例です.
セッション2.update(usr)の場合、usr 2自体が永続状態オブジェクトであり、usrは遊離状態オブジェクトであり、両者のoidは一致するため、sessionは2番目のオブジェクトが同じoidに関連していると考えて問題が発生する.ソリューションはmergeを採用する.mergeは,伝達オブジェクトの知識を改session対応の持続化オブジェクトに与え,元のパラメータであるオブジェクトは遊離状態を維持する.
参考内容:http://www.blogjava.net/dreamstone/archive/2007/07/29/133071.html http://caterpillar.onlyfun.net/Gossip/HibernateGossip/Session.html
session.beginTransaction();
User usr = (User)session.get(User.class, new Long(1));
usr.setNickName("c");
session.getTransaction().commit();
session.close();
基本的には簡単で簡単ではありませんが、驚いたことに、私は現実的な呼び出しセッションを持っていません.updateとか、自動更新してくれたなんて...どうしてか本当に分からない.
答え:updateは脱管状態のオブジェクトを操作し、flushは持続状態のオブジェクトを操作します.
余談ですが、本題に入りましょう.セッションごとに同じoidに1つの永続状態のオブジェクトしか対応できません.oidのオブジェクトに複数のオブジェクトがあると、例外が発生します.NonUniqueObjectException
例えば次の例です.
private void doMerge() {
User usr = new User();
usr.setOid((long)1);
usr.setNickName("c++");
Session session2 = HibernateSessionFactory.getSessionFactory().openSession();
session2.beginTransaction();
User usr2 = (User)session2.load(User.class, new Long(1));
usr2.setNickName("covex");
//User usr3 = (User)session2.merge(usr);
session2.update(usr);
session2.getTransaction().commit();
session2.close();
}
セッション2.update(usr)の場合、usr 2自体が永続状態オブジェクトであり、usrは遊離状態オブジェクトであり、両者のoidは一致するため、sessionは2番目のオブジェクトが同じoidに関連していると考えて問題が発生する.ソリューションはmergeを採用する.mergeは,伝達オブジェクトの知識を改session対応の持続化オブジェクトに与え,元のパラメータであるオブジェクトは遊離状態を維持する.
private void doMerge() {
User usr = (User)session.get(User.class, new Long(1));
session.close();
usr.setNickName("456");
Session session2 = HibernateSessionFactory.getSessionFactory().openSession();
session2.beginTransaction();
User usr2 = (User)session2.load(User.class, new Long(1));
User usr3 = (User)session2.merge(usr);
System.out.println(usr2 == usr3);//true。 。
usr2.setNickName("covex");
session2.update(usr2);//usr2 , update
session2.getTransaction().commit();
session2.close();
}
参考内容:http://www.blogjava.net/dreamstone/archive/2007/07/29/133071.html http://caterpillar.onlyfun.net/Gossip/HibernateGossip/Session.html