Хайбернейт: про борьбу с lazy exception in hibernate no Session и nested transactions not supported
Приветы.
Имеемс обычную слоеную структурку в веб-приложении на основе Vaadin 6.8 : домен/ДАО (интерфейс и имлементация)/сервисы (интерфейс и имлементация). В качестве ОРМ взят Хайбернейт (4.2.х релиз). Никакого Спринга али JEE нет.
На ДАО уровне говоримс с БД посредством хиберной сессии. Хиберная сессия берется из фабрики сессии, которая сидит как приватная статич. переменная
На уровне сервиса реализована как бизнес-логика так и управление транзакциями
В настоящее время пытаюсь победить проблемки а-ля lazy exception in hibernate no Session и nested transactions not supported.
О борьбе на упрощенном примере:
Есть домен Person с oneToMany к Children, для него задекларирован ДАО интерфейс, а также соотв. IPersonService интерфейс и PersonService реализация .
Далее имеемс домен DailyPlan с oneToMany к Task и Person, a с соотв задекларированным ДАО интерфейсом и реалзацией, а также с соотв. IDailyPlanService (DailyPlanService реализация).
Как IPersonService так и IDailyPlanService наследуют базовый сервис IRootService.
В первый момент времени начинает строится DailyPlan на неделю как для самой персоны, так и для ее детишег. Пока еще никаких траблов нет: чинна и благародна создается домен DailyPlan с задачами, задейстован только DailyPlanService )
Затем создаются персоны с детишками - и снова пока все типтоп задейстован только PersonService . Траблы начинаются, когда извне находится реализация запроса с помощью DailyPlanService (типа сервис, а дайка мне всех персон, для которых есть план на день) , а внутри в цикле вызывается обработка с помощью PersonService. Если я после запроса на всех персон закрываю хибер-сессию, то получаю List с хибер PersistentList реализацией. И сия реализация всенепременно желает открытой сессии -плюет lazy exception in hibernate no Session (Это удалось победить копированием в ArrayList с посл. его возвратом). Но это как то не аккуратненько:-((
Потому как детачнутые елементы у него и надо и аатачивать.
Попытался другим пойти путем: когда с помощью DailyPlanService запрос формирую на упорядоченных плану персон, Не закрываю сессии и не коммитю транзации. Сессию беру ДО запроса, транзакцию открываю также до Запроса. Затем работаю с PersonService - но тут опа вылазит: PersonService в наст. время ничерта не знает, что транзакция хибера УЖЕ активна. И ругаеццо :nested transactions not supported. (Что для меня по чесноку дико, т.к. работая в другом предпритии имел самопальный фреймворк, который nested transactions поддерживал). Собрался уже на нижний уровень спускаться, врепер написать для хибер транзацкии, который бы не открывал транзации, если она уже активна и соотв. не коммитил транзакции , если она при открытии была активной и на уровне хиберутилилы все это реализовывал бы (Т.к хиберутилитой как DailyPlanService так и PersonService пользуются - но это какой-то самопальный наколенный недоспринг с его декларативными трансакциями-управлением напоменает . Посему на данный момент времени шаг за шагом так переделываю алгоритм, шоб данные в листы собирать и следить, шоб не дай бог при работе DailyPlanService не вмешивался бы PersonService .
Можно конечно PersonService смешать с DailyPlanService , но это было бы не аккуартненько опять же.
П.С если вдруг ктонить знаком с Vaadin более приближенное к реальной проблеме описалово;-): План на день представлен в виде таблицы: столбцы: 1й столбец - заголовок соотв. Ф.И.О человека. Дальнейшие столбцы. - время от 0 до 24 часов почасово. В ячейке (пересечение строки - Ф.И.О и столбца с врем. )
- список заданий на час:-). Ф.И.О человека редактируемо. На поле , которое отображет Ф.И.О посажен лисенер. Так вот, например изменение Ф.И.О будет. И создается описанная ситуация выше
По следам советов: Спасиб еще раз за советы. Нашел еще тут пару советов http://pronicles.blogspot.de/2009/09/orghibernatelazyinitializationexception.html И тут (
http://ornitos.blogspot.de/2009/02/hibernate.html но код не рабочий, дебагить пока нет времени) В настоящее время готовлю полностью проинициализированные колекции, используя...многократно...initialize:-(((. Аккуратненького мало. Да. Вариант OpensessioninView пока не желаю -т.к. Ваадин со своими реквестами забомбит хибер-сессию. Подумываю нах вырубить ленивую закрузку для сущностей, которые почти всегда надобны. Такие дела.
Имеемс обычную слоеную структурку в веб-приложении на основе Vaadin 6.8 : домен/ДАО (интерфейс и имлементация)/сервисы (интерфейс и имлементация). В качестве ОРМ взят Хайбернейт (4.2.х релиз). Никакого Спринга али JEE нет.
На ДАО уровне говоримс с БД посредством хиберной сессии. Хиберная сессия берется из фабрики сессии, которая сидит как приватная статич. переменная
На уровне сервиса реализована как бизнес-логика так и управление транзакциями
В настоящее время пытаюсь победить проблемки а-ля lazy exception in hibernate no Session и nested transactions not supported.
О борьбе на упрощенном примере:
Есть домен Person с oneToMany к Children, для него задекларирован ДАО интерфейс, а также соотв. IPersonService интерфейс и PersonService реализация .
Далее имеемс домен DailyPlan с oneToMany к Task и Person, a с соотв задекларированным ДАО интерфейсом и реалзацией, а также с соотв. IDailyPlanService (DailyPlanService реализация).
Как IPersonService так и IDailyPlanService наследуют базовый сервис IRootService.
В первый момент времени начинает строится DailyPlan на неделю как для самой персоны, так и для ее детишег. Пока еще никаких траблов нет: чинна и благародна создается домен DailyPlan с задачами, задейстован только DailyPlanService )
Затем создаются персоны с детишками - и снова пока все типтоп задейстован только PersonService . Траблы начинаются, когда извне находится реализация запроса с помощью DailyPlanService (типа сервис, а дайка мне всех персон, для которых есть план на день) , а внутри в цикле вызывается обработка с помощью PersonService. Если я после запроса на всех персон закрываю хибер-сессию, то получаю List с хибер PersistentList реализацией. И сия реализация всенепременно желает открытой сессии -плюет lazy exception in hibernate no Session (Это удалось победить копированием в ArrayList с посл. его возвратом). Но это как то не аккуратненько:-((
Потому как детачнутые елементы у него и надо и аатачивать.
Попытался другим пойти путем: когда с помощью DailyPlanService запрос формирую на упорядоченных плану персон, Не закрываю сессии и не коммитю транзации. Сессию беру ДО запроса, транзакцию открываю также до Запроса. Затем работаю с PersonService - но тут опа вылазит: PersonService в наст. время ничерта не знает, что транзакция хибера УЖЕ активна. И ругаеццо :nested transactions not supported. (Что для меня по чесноку дико, т.к. работая в другом предпритии имел самопальный фреймворк, который nested transactions поддерживал). Собрался уже на нижний уровень спускаться, врепер написать для хибер транзацкии, который бы не открывал транзации, если она уже активна и соотв. не коммитил транзакции , если она при открытии была активной и на уровне хиберутилилы все это реализовывал бы (Т.к хиберутилитой как DailyPlanService так и PersonService пользуются - но это какой-то самопальный наколенный недоспринг с его декларативными трансакциями-управлением напоменает . Посему на данный момент времени шаг за шагом так переделываю алгоритм, шоб данные в листы собирать и следить, шоб не дай бог при работе DailyPlanService не вмешивался бы PersonService .
Можно конечно PersonService смешать с DailyPlanService , но это было бы не аккуартненько опять же.
П.С если вдруг ктонить знаком с Vaadin более приближенное к реальной проблеме описалово;-): План на день представлен в виде таблицы: столбцы: 1й столбец - заголовок соотв. Ф.И.О человека. Дальнейшие столбцы. - время от 0 до 24 часов почасово. В ячейке (пересечение строки - Ф.И.О и столбца с врем. )
- список заданий на час:-). Ф.И.О человека редактируемо. На поле , которое отображет Ф.И.О посажен лисенер. Так вот, например изменение Ф.И.О будет. И создается описанная ситуация выше
По следам советов: Спасиб еще раз за советы. Нашел еще тут пару советов http://pronicles.blogspot.de/2009/09/orghibernatelazyinitializationexception.html И тут (
http://ornitos.blogspot.de/2009/02/hibernate.html но код не рабочий, дебагить пока нет времени) В настоящее время готовлю полностью проинициализированные колекции, используя...многократно...initialize:-(((. Аккуратненького мало. Да. Вариант OpensessioninView пока не желаю -т.к. Ваадин со своими реквестами забомбит хибер-сессию. Подумываю нах вырубить ленивую закрузку для сущностей, которые почти всегда надобны. Такие дела.
