インメモリ Hibernate エンティティの現在の値をデータベースの値と比較したい:
HibernateSession sess = HibernateSessionFactory.getSession();
MyEntity newEntity = (MyEntity)sess.load(MyEntity.class, id);
newEntity.setProperty("new value");
MyEntity oldEntity = (MyEntity)sess.load(MyEntity.class, id);
// CODEBLOCK#1 evaluate differences between newEntity and oldEntity
sess.update(newEntity);
CODEBLOCK#1では、そのnewEntity.getProperty()="new value"
ANDを取得しますoldEntity.getProperty()="new value"
(もちろん、期待していoldEntity.getProperty()="old value"
ましたが)。実際、2 つのオブジェクトはメモリ内でまったく同じです。
いじって、それを取り除くようHibernateSessionFactory.getSession().evict(newEntity)
に設定しようとしました(比較のためだけに必要です):oldEntity=null
HibernateSession sess = HibernateSessionFactory.getSession();
MyEntity newEntity = (MyEntity)sess.load(MyEntity.class, id);
newEntity.setProperty("new value");
HibernateSessionFactory.getSession().evict(newEntity);
MyEntity oldEntity = (MyEntity)sess.load(MyEntity.class, id);
// CODEBLOCK#1 evaluate differences between newEntity and oldEntity
oldEntity = null;
sess.update(newEntity);
そして今、2つのエンティティは別個のものですが、もちろん私は恐ろしいorg.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session
.
何か案が?
EDIT:ダブルセッション戦略を試しました。HibernateSessionFactory
セッションのマップを実装するように変更した後...
Session session1 = HibernateSessionFactory.getSession(SessionKeys.DEFAULT);
Session session2 = HibernateSessionFactory.getSession(SessionKeys.ALTERNATE);
Entity newEntity = (Entity)entity;
newEntity.setNote("edited note");
Entity oldEntity = (Entity)session1.load(Entity.class, id);
System.out.println("NEW:" + newEntity.getNote());
System.out.println("OLD: " + oldEntity.getNote()); // HANGS HERE!!!
HibernateSessionFactory.closeSession(SessionKeys.ALTERNATE);
oldEntity ノートを印刷しようとしているときに、単体テストがハングします... :-(