Сегодня я столкнулся с очередной проблемой в спящем режиме:Ленивый инициализация коллекции проваливается в спящем режиме
Моего метод:
@Transactional
public Period getDefault(Team team) {
Period defaultPeriod = team.getDefaultPeriod();
List<Period> periods = _periodDAO.getPeriods(team);
if (!periods.contains(defaultPeriod)) {
defaultPeriod = periods.get(periods.size() - 1);
}
}
_periodDAO.initializeIssues(defaultPeriod);
return defaultPeriod;
}
Метод initializeIssues:
public void initializeIssues(Period period) {
if (period.getIssues() != null) {
Hibernate.initialize(period.getIssues());
}
}
я получаю исключение, если коллекция периодов содержит defaultPeriod
Caused by: org.hibernate.HibernateException: collection is not associated with any session
at org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:474)
at org.hibernate.Hibernate.initialize(Hibernate.java:417)
Но если удалить несколько строк и метод изменения в
@Transactional
public Period getDefault(Team team) {
Period defaultPeriod = team.getDefaultPeriod();
_periodDAO.initializeIssues(defaultPeriod);
return defaultPeriod;
}
Он отлично работает.
Я отлаживал первый пример, а сеанс спящего режима не закрывался в течение всего метода.
Как я понимаю, если загруженный объект (один элемент в периоды) в сессии имеет коллекцию, которая связана с активной сессии и существовавшей до объекта (defaultPeriod) также имеет ту же ассоциацию - это (defaultPeriod) потеряет его ассоциации.
Это правда? Кто еще столкнулся с такой же проблемой?
Благодарим за ответы.
Спасибо! Но ** TransactionManager ** устанавливает нулевое поле ** Session ** для * issues * in * defaultPeriod * только в том случае, если * периоды * содержат * defaultPeriod *, если нет - * issues * будет хорошо инициализироваться. – Alexz
@OleksandrZ Я бы посмотрел на ваш метод 'equals()' для сравнения экземпляров 'Period'. Хотя 'Periods' может содержать его, тот, который находится в коллекции, привязан к' Session', а другой - снаружи. –
** равно ** метод очень прост и основан на сравнении ** Period ** id. Я могу инициализировать проблемы ** defaultPeriod ** только в том случае, если я снова не возвращаюсь из db этого объекта, поэтому, если я изменю код и добавлю ** Period defaultPeriod2 = _periodDAO.get (defaultPeriod.getId()); ** вместо извлечение ** периодов **, проблемы снова не будут инициализированы. Благодарю. – Alexz