Блокировка спящего режима вызывает исключение грязной коллекции - PullRequest
1 голос
/ 29 марта 2012

Я пытаюсь повторно присоединить к сеансу объект из сеанса HTTP, который был первоначально получен из БД, я делаю это, вызывая session.lock(object, LockMode.None), и хотя блокировка не работает каскадно, для меня это работает нормально, потому что это делает не загружать обновления в БД, как merge (блокировка необходима для открытия подробного представления во всплывающем окне, а фактическое сохранение будет происходить позже в главном окне). Теперь, к моему удивлению, я обнаружил, что если моя сущность имеет отношение один ко многим, любые изменения в этой коллекции вызовут HibernateException «Повторно связанный объект имеет грязную коллекцию».

Как я могу присоединить объекты к сеансу, не обновляя БД и не отменяя изменения в объекте?

Вот ситуация как код

  EntityA t = createAnEntityA();
  Session sess = factory.openSession();
  sess.beginTransaction();
  sess.save(t);
  sess.getTransaction().commit();
  sess.close();
  // t is now saved on the DB but in dettached state



  // change a simple property
  sess = factory.openSession();
  sess.beginTransaction();
  t.setPropertyB("B");
  sess.lock(t, LockMode.NONE);
  // t is attached again, you won't get LazyInitializationException
  // by calling its properties, although you have to be careful 
  // because the reattachment does not cascade to children
  sess.getTransaction().commit();
  sess.close();
  // no updates went to the DB because setPropertyB was called
  // when t was still dettached

  // now change a collection
  EntityC c = createAnEntityC();
  t.getCollectionPropertyC().add(c);
  sess = factory.openSession();
  sess.beginTransaction();
  sess.lock(t, LockMode.NONE);
  // Exception is thrown :-(
  sess.getTransaction().commit();
  sess.close();

1 Ответ

1 голос
/ 30 марта 2012

Боюсь, в настоящее время это невозможно без удара по БД.По-видимому, исключение происходит из-за команды блокировки.

Существует Jira, сообщающее об этом поведении.
https://hibernate.atlassian.net/browse/HHH-511

У него есть 2 исправления для решения проблемы.Вы можете попробовать эти патчи.

Но если у вас проблема только с отложенной загрузкой коллекции, вы можете использовать шаблон Open Session In View .(возможно, не самый лучший шаблон, но он может работать в вашем случае)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...