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