Привет, я создаю четырехуровневую программную систему (презентация - JSP, проблемный домен, логика приложения, постоянство) и хочу, чтобы мои транзакции находились в режиме гибернации для каждого запроса, чтобы не выполнять транзакции каждыйраз я хочу что-то сделать и ...
Меня интересует, как бы вы сделали ваше приложение с 4 уровнями абстракции, когда вы используете ClickServlet для поддержки одной транзакции на запрос.AFAIK ваша транзакция будет иметь столько же запросов, сколько ваши активные рабочие потоки сервлета.
Если вы хотите использовать возможности отложенной загрузки Hibernate, вам необходимо:
(1) поддерживать транзакцию, когдазапрос по-прежнему активен (так что вы не получите исключение LazyLoadingException), или
(2) вам нужно разделить слой, заставить слой передавать DTO и VO вместо передачи модели Hibernate на слои выше.
ИМО, последний - более чистый подход, так как основная цель создания слоев абстракции состоит в том, чтобы облегчить их повторное использование, тестирование и разделение проблем.
Я предлагаю вам не делать этогообрабатывать транзакции на уровне сеанса / запроса сервлета.Это сделает весь ваш слой ниже презентации тесно связанным с Servlet API.Обычно это не то, что мы хотим, когда нам нужны слои абстракции.Поэтому, вероятно, Apache Click Framework и его ClickServlet - не лучший способ сделать это.Весна справится с этим лучше.Если вы получили вето, слишком плохо, то.
Если вы не хотите использовать автоматизированную транзакцию Spring, вы все равно можете использовать AspectJ (или другие аспекты аспектно-ориентированного программирования) для прозрачной обработки транзакции (создания транзакции при вводеметоды и коммит / откат при выходе из методов).Конечно, это гораздо сложнее, чем просто принятие Spring Framework.
... и то, что я могу отслеживать данные с моими объектами, так что обновляются только измененные свойства.
Эта задача может быть прозрачно обработана Hibernate Level 1 Cache + Lazy Loading.Вам не нужно делать это самостоятельно.Hibernate будет генерировать SQL для бэкэнда только во время очистки сеанса, или когда кэш L1 заполнен, или при фиксации транзакции.В общем, вам не нужно ничего делать, чтобы минимизировать операторы языка манипулирования данными (DML) для бэкэнда, обычно Hibernate обрабатывает это лучше при правильной настройке.
Я также посмотрел на JTA иЯ не могу понять, как это было бы полезно, так как я не использую бины.
Вы можете использовать JPA без бинов.Это просто API, который вы можете вызывать из любого места.
Я думал о решении, таком как наличие метода для вызова для закрытия и открытия транзакций, но кажется, что может быть более элегантное решение.
Да.Посмотрите на аспектно-ориентированное программирование Грегора Кичалеса.Spring Framework поддерживает эту стандартную AOP.Если ваша команда наложила вето, вы все равно можете сделать это самостоятельно.
Каков наилучший способ сохранить мою транзакцию для каждого запроса на основе моей системы?
Наилучший подход (если вы запланировали иметь 4 уровня абстракции) - это загрузить данные из моделей домена Hibernate в объект переноса данных / объект значений на уровне постоянства.Уровень выше, уровень логики приложений, имеет доступ к модели домена Hibernate, но не может передавать модели Hibernate на уровень выше.Чтобы сделать его эффективным, вы должны реализовать разбиение на страницы в этих слоях (в противном случае вы часто будете загружать все данные в память, что плохо).
Таким образом, в сочетании с аспектированием транзакции, я думаюэто лучшая практика.