Как избавиться от LazyInitializationException с интеграцией Wicket JPA / Hibernate (с Spring) - PullRequest
7 голосов
/ 18 января 2010

Я занимаюсь разработкой приложения с использованием Wicket в качестве слоя представления и JPA (Hibernate) в качестве ORM.Создание пользовательского интерфейса было забавным (даже с ajax) с использованием Wicket.Моя проблема возникает из-за интеграции постоянных объектов на страницах редактирования (страницы с доступом только для чтения не проблема с использованием LoadadableDetachableModel).

Я использую фильтр OSIV из весны, чтобы обеспечить открытую сессию для представления.Но, поскольку я сохраняю доменные объекты (сопоставленные классы @Entity) на страницах редактирования, я получаю страшное исключение отложенной загрузки при обращении к их свойствам в обратных вызовах ajax.

Я действительно не хочу этогоидите по дороге DTO / VO, так как я думаю, что это только раздувает код и требует от меня написания большого количества кода-шаблона.

Одна идея состояла в том, чтобы использовать объекты модели в представлении, объединить переданныев объекте с текущим сеансом гибернации и доступ ко всем получателям для полной инициализации объекта.после этого объект будет сохранен в виде (seesion) и станет отделенным.После сохранения я бы заново слил его и передал бы изменения.

Это рекомендуемый способ?Есть ли лучшие решения?Как ни странно, большинство книг / блогов / статей полностью игнорируют такую ​​проблему.

Какое управление транзакциями вы бы предложили?Прямо сейчас я использую @Transaction на сервисном уровне.Как это изменится, если я буду использовать другие способы доступа к хранению данных в сеансах гибернации?

Любые указатели / ссылки приветствуются, так как я здесь немного потерялся ..

заранее спасибо

Ответы [ 4 ]

6 голосов
/ 18 января 2010

Этот пост в блоге (посвященный деталям LDM) дал мне несколько полезных идей, особенно для сценариев редактирования:

Создание умной модели EntityModel

FWIW У меня были очень хорошие результаты при использовании пользовательского RequestCycle (как предложено в разделе комментариев ссылки выше) в PerfBench , и вы можете найти код здесь . IIRC это упрощение подхода (OpenSessionInView / London Wicket) по ссылке, размещенной Божо.

3 голосов
/ 18 января 2010

Это - краткая презентация OpenSessionInView с Wicket.

При правильном использовании подход OpenSessionInView должен гарантировать отсутствие LazyInitializationException.

1 голос
/ 29 апреля 2010

Наконец-то у меня появилось время снова заняться этой проблемой. Не знаю, как я мог пропустить простое решение;)

Мы разработали собственную UIFormModel реализацию интерфейса Wickets IModel. Поскольку я хотел сохранить пользовательский ввод во время http-запросов, я ничего не делал в вызове detach (), поддерживая (и сериализуя) объект модели в полном состоянии.

Все, что мне нужно было добавить , было флагом, что detach () назывался , и проверить этот флаг в методе getObject(). Если флаг был установлен, я делаю EntityManager.merge() и имею подключенную модель, которую я могу использовать в компонентах пользовательского интерфейса.

Спасибо всем за ваш вклад

0 голосов
/ 26 февраля 2010

Если вы используете LoadadableDetachableModel, которые вы не передаете компоненту в качестве модели, то wicket не будет вызывать .detatch () для них, и часто они тоже не сериализуются, поэтому у них будут старые данные, и они будут выбрасывать ленивые исключение.

Обязательно всегда передавайте LDM компоненту или отсоединяйте их самостоятельно.

...