Если вы спросите меня, главная ошибка, кажется, заключается в том, чтобы придерживаться почти голого Tomcat, когда ваши требования, кажется, кричат о чем-то более причудливом.Обычно мантра заключается в том, что вы используете Tomcat, когда вам не нужны «все эти другие вещи», поэтому, когда вам это нужно, зачем продолжать использовать голый Tomcat?
Тем не менее, шаблон действительно не 't, что трудно.
- Иметь базовый компонент области видимости
- Получить исходные данные в
@PostConstruct
- (когда нет параметров, таких как идентификаторы) или PreRenderViewEvent
в методекомбинация с параметрами представления - Использование отдельного класса Service, который использует диспетчер сущностей для получения и сохранения данных
- Сделать диспетчер сущностей "областью действия"
- Без EJB / CDI/ Spring:
- Получать нового менеджера сущностей из фабрики менеджеров сущностей для каждой операции.
- Запустить (локальная) ресурсная транзакция, выполнить операцию, зафиксировать транзакцию, закрыть диспетчер сущностей.
- Возврат списка сущностей непосредственно из вашего компонента поддержки, привязка полей ввода режима редактирования таблицы к соответствующим свойствам сущности.
- При обновлении одной строки передайте соответствующий объект методу обновления вашего сервиса.Помимо накладных расходов на получение менеджера сущностей, запуск транзакции и т. Д., Это в основном вызывает только
merge()
на менеджере сущностей.
Поймите, что вне службы вы работаете с detached entities
allвремя.Таким образом, нет никакого риска для каких-либо исключений LazyInitializationException.Базовые компоненты должны находиться в области видимости, чтобы корректный (отделенный!) Объект обновлялся с помощью JSF, который затем передавал ваш собственный код службе, который сливал ее в контекст постоянства.
Поток для сохранениятаким образом:
<i>View state</i> <i>View scope </i> <i>Transaction scoped PC</i>
<b>Facelet/components</b> <b>Backing Bean</b> <b>Service</b>
Strings ------> Detached entities --> Attached entities
(процесс получения данных в точности обратный)
Создание службы таким способом является немного утомительным и своего рода мазохистским упражнением.Для примера приложения и только двух методов (get и update), описанных выше, это не так уж плохо, но для любого значительного приложения это быстро выйдет из-под контроля.
Если вы уже добавляете JSF иJPA для Tomcat, просто сделайте себе одолжение и используйте что-то вроде TomEE .Это чуть больше, чем Tomcat (25 МБ против 7 МБ) и содержит все то, что вы, якобы, пытаетесь избежать, но в действительности вам все равно нужно.
В случае, если вы абсолютно не можете обновить установку Tomcat (например, продуктвладелец или менеджер считает, что ему принадлежит сервер, а не разработчики), возможно, вы захотите инвестировать в изучение CDI.Это может быть легко добавлено к вашей войне (только один дополнительный кувшин) и позволит вам абстрагироваться от утомительного кода.Одна вещь, которую вы также можете использовать, - это JTA-провайдер.Это тоже может быть добавлено отдельно к вашей войне, но чем больше этого материала вы добавите, тем лучше у вас останется, просто используя TomEE (или альтернативы, такие как GlassFish, Resin, JBoss и т. Д.).
Также см.эта статья, которая охватывает различные части ваших требований: Связь в JSF 2.0