Подтвердить что ты не робот

Где следует "@Transactional" размещать Сервисный уровень или DAO

Во-первых, возможно, что я спрашиваю что-то, о чем уже спрашивали и отвечали раньше, но мне не удалось получить результат поиска. Ладно, в общем (или всегда так далеко :)) Мы определяем транзакционные аннотации на уровне сервисов. Типичный весенний спящий режим - это обычно

Controller->Manager->Dao->Orm.

Теперь у меня есть ситуация, когда мне нужно выбирать между моделью домена, основанной на сайте клиента. Скажем, клиент А использует мою модель домена, все хорошо, но тогда другой клиентский сайт предоставит мне веб-сервис и не будет использовать нашу модель домена.

Какой слой я должен заменить. Я считаю, что это должен быть DAO, который будет получать мне данные из веб-службы и отправлять их обратно. Т.е. два отдельно написанных слоя DAO и подключаться в зависимости от сценария.

Теперь я понял, что мы делаем тесную связь (если есть такая вещь или, скажем, не имеет слабой связи), когда мы помещаем @Transactional на уровень обслуживания. Так много мозгов не могут ошибаться или они (я в этом сомневаюсь).

Итак, вопрос "Где должен быть" @Transactional "" место уровня обслуживания или DAO? " и это сервисный слой вниз, я должен заменить.

4b9b3361

Ответ 1

В идеале уровень обслуживания (Manager) представляет вашу бизнес-логику, и поэтому он должен быть помечен @Transactional.

Сервисный уровень может вызывать разные DAO для выполнения операций с БД. Предположим, что у вас есть 3 операции DAO в сервисном методе. Если ваша 1-я операция DAO завершилась неудачно, другие две могут все еще быть пропущены, и вы получите несовместимое состояние БД. Сервисный слой Annoating может спасти вас от подобных ситуаций.

Ответ 2

Вы хотите, чтобы ваши услуги были транзакционными. Если ваши DAO являются транзакционными, и вы вызываете разные DAO в каждой службе, то у вас будет несколько транзакций, а это не то, что вам нужно. Сделайте вызовы служб транзакционными, и все вызовы DAO внутри этих методов будут участвовать в транзакциях для метода.

Ответ 3

я предложу поместить @Transactional в методы уровня сервиса, поскольку у нас может быть несколько реализаций DAO. с помощью этого мы можем сделать наши услуги транзакционными. см

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

Сервис - лучшее место для размещения @Transactional, уровень сервиса должен содержать поведение сценария использования уровня детализации для взаимодействия с пользователем, которое логически должно происходить в транзакции. таким образом мы можем поддерживать разделение между кодом веб-приложения и бизнес-логикой.

Есть много приложений CRUD, которые не имеют какой-либо существенной бизнес-логики, для них наличие сервисного уровня, который просто передает данные между контроллерами и объектами доступа к данным, бесполезно. В этих случаях мы можем поместить аннотацию транзакции в Dao.

Таким образом, на практике вы можете поместить их в любом месте, это до вас.

При наличии нескольких вызовов в вашем сервисе вам нужен @Transactional в сервисе. разные вызовы в службу будут выполняться в разных транзакциях, если вы введете @Transactional в службу.

Ответ 4

Это индивидуальный выбор, основанный на типах приложений, если приложение является многоуровневым во многих модулях, а большинство операций основано на @CRUD, а затем добавление @transactional аннотации на уровне обслуживания делает больше... тип типа приложения, например планировщики, серверы заданий, @etl report apps, где сеансы и пользовательская концепция не существует, тогда наиболее важна пропагандистская транзакция на уровне контекста... мы не должны создавать транзакции clusterd, ставя @transactional каждый раз, когда заканчиваем транзакционные анти-паттеры... в любом случае для прагматичного управления транзакциями JTA2 является наиболее подходящим ответом... снова это зависит от погоды, которую вы можете использовать в определенных ситуациях...

Ответ 5

Вы должны использовать @Transactional на уровне сервиса, если вы хотите изменить модель домена для клиента B, где вы должны предоставить одни и те же данные в другой модели, вы можете изменить модель домена, не влияя на уровень DAO, предоставив другой службы или путем создания интерфейса и реализации интерфейса в разных моделях и с тем же сервисом, который заполняет модель на основе клиента. Это решение основано на бизнес-требовании и сфере действия проекта.