Я хочу сравнить текущее значение находящегося в памяти объекта 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"
И oldEntity.getProperty()="new value"
(хотя я ожидал oldEntity.getProperty()="old value"
, конечно). На самом деле эти два объекта абсолютно одинаковы в памяти.
Я запутался с 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);
и теперь эти две сущности различны, но, конечно, я получаю страшную org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session
.
Есть идеи?
РЕДАКТИРОВАТЬ: Я попробовал стратегию двойной сессии; Я изменил свой 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 ...: - (