Я заново присоединяю отсоединенный объект с несколькими постоянными коллекциями к новому сеансу Hibernate со следующим фрагментом:
sessionFactory.getCurrentSession().lock(myDetachedObject);
Этот код выполняется в pointcut AspectJ, который запускается всякий раз, когда постоянная коллекция являетсяaccessaged.
Объект не изменяется, пока он отсоединен, и после повторного присоединения я могу получить доступ и изменить постоянные коллекции объекта без проблем.Однако если я не получаю доступ ни к одной из постоянных коллекций после повторного присоединения , тогда, когда я закрываю сеанс и фиксирую свою работу, все постоянные коллекции удаляются из базы данных .Это как если бы я вызывал метод clear()
для каждого из них.
Все мои коллекции явно настроены как CascadeType.ALL
, и я понял, что при этом они будут правильно присоединены к сеансу как частьсобытия LOCK
.Я понимаю, что если у меня нет доступа к любым постоянным коллекциям, то срабатывание точки запускается, пока Hibernate готовится очистить сеанс.Есть ли какой-либо другой способ присоединения объекта к сеансу, который не позволяет Hibernate ненадлежащим образом удалять коллекции?
ОБНОВЛЕНИЕ : я пробовал другие режимы блокировки (LockMode.READ
, LockMode.UPGRADE
) и методы присоединения (вызов session.update()
вместо session.lock()
).Это предсказуемо изменило поведение действия присоединения, но не в результате.Коллекции все еще удалены.Я также написал небольшой тест, чтобы подтвердить, что коллекции удаляются, только если объект повторно присоединен во время операции очистки.