Spring и Hibernate транзакции - PullRequest
       1

Spring и Hibernate транзакции

3 голосов
/ 21 января 2011

Я новичок в Spring и только что прочитал документы об интеграции Hibernate-Spring (версия 3).Я не понимаю, почему автоматическое управление транзакциями (декларативное) применяется к «службе» в документах, а не напрямую к реализации DAO.В частности, я не понимаю, что они подразумевают под сервисом, в чем разница с DAO, и действительно ли это необходимо для обеспечения интеграции Hibernate со Spring.

Я пытался использовать только реализацию DAO Hibernate и настраивать в XML, чтобы при создании экземпляра была установлена ​​фабрика сеанса.Во всяком случае, это вызывает исключения, потому что Spring не допускает нетранзакционный доступ в спящий режим.Итак, чтобы добавить транзакционный доступ, я должен добавить эту «услугу»?Чем это отличается от простого DAO?

Ответы [ 4 ]

6 голосов
/ 21 января 2011

Я не могу сказать о весне, но я отвечу на этот вопрос в общем виде:

В частности, я не понимаю, что они имеют в виду под обслуживанием, в чем разница с DAO

Представьте себе классический сценарий "денежного перевода", когда один клиент отправляет деньги второму клиенту. Здесь есть одна «услуга» (перевод денег), которая выполняется в два этапа: вычесть деньги со счета A, добавить деньги на счет B. Эти два шага должны быть в одной транзакции, даже если каждый из них выполняет манипулирование базой данных. Если транзакция завершится неудачей во время второго шага, первый также должен быть отменен.

В этом случае Сервис будет выглядеть так:

transfer(Account to, Account from, double value)

И DAO будет выглядеть так:

updateBalance(Account account, double amount)

Метод transfer будет вызывать updateBalance дважды, по одному для каждой операции.

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

3 голосов
/ 21 января 2011

DAO (объект доступа к данным) - это только шаблон проекта или имя класса, который влияет на этот шаблон.

Сервис - это термин (Spring) для (наиболее одноэлементного) класса, который предоставляет некоторые (бизнес) функциональные возможности сервиса. И это также имя аннотации для объявления класса как службы в Spring.

исправлено: хранилище вместо ресурса

Весной есть много способов реализовать DAO, наиболее распространенными из которых являются:

  • Использование класса шаблонов Spring Hibernate (устарело в Spring 3.0)
  • Делаем это вручную и помечаем класс DAO аннотацией @ Repository (аналогично @Service, (поскольку @ Repository и @ Service означают только предоставление подклассов @ Component ))
1 голос
/ 21 января 2011

DAO отвечает за инкапсуляцию доступа к данным в базе данных.Примерами доступа к данным в базе данных являются сохранение, добавление, удаление, получение.Обратите внимание, что это не имеет никакого отношения к какой-либо бизнес-логике.

Служба отвечает за управление бизнес-логикой.Например, ваш пользователь отправил два элемента.Вы не сохраняете их автоматически в базу данных.Вы могли бы хотеть проверить сначала, если пункты действительны.Возможно, вы захотите отфильтровать или дополнить данные, связанные с этими элементами.Как только вы закончите с проверкой и фильтрацией / обогащением, это будет то время, когда вы сохраните его для создания базы данных.Чтобы сохранить ваши предметы, вы используете DAO.

0 голосов
/ 24 января 2011

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

Если вы хотите вызывать DAO непосредственно из контроллера (что иногда происходит в контексте доменного управленияили даже в многоуровневых проектах, где вы просто предпочитаете вызывать DAO напрямую, а не реализовывать сквозные методы уровня обслуживания), вам потребуются транзакции в ваших DTO.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...