2012-01-24 2 views
12

У меня есть компонент, который должен обновить базу данных для клиента и адреса клиента (через JDBC). Уместно ли вызывать CustomerAddressDAO из CustomerDAO? Или создать отдельный компонент CustomerDataManager, который вызывает их отдельно?Может ли DAO позвонить DAO?

+1

Что блокирует вас от этого в бизнес-слое? – Andre

ответ

24

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

Проблема с DAO, вызывающими другие DAO, вы быстро получите в итоге круглые ссылки. Инъекционная инъекция становится намного сложнее.

4

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

4

Очевидно, что вы можете сделать это по-разному. Но, чтобы правильно ответить на этот вопрос, вы должны начать с вашей модели. В модели см. «Адрес - это объект» (что-то с его собственным идентификатором и используется также независимо), или это тип значения (что имеет смысл только в контексте Клиента. Затем у вас будет два случая:

  1. Адрес является Entity: в этом случае, адрес имеет свой собственный Dao и Клиент имеет свой собственный Dao Ни Dao должен получить доступ к другой, если есть какая-то логика, которая должна управлять два, то, что.. должен находиться в вашей логике приложения, а не в уровне доступа к данным.

  2. Адрес - тип значения, связанный с Заказчиком: В этом случае адрес не имеет отдельного DAO его низкая частота Он сохраняется/восстанавливается как часть объекта Customer.

Заключение: При надлежащем проектировании DAO не имеют доступа друг к другу (в стандартных ситуациях).

+1

«Если есть какая-то логика, которая должна управлять этими двумя, то это должно быть в вашей логике приложения, а не в Data Access Layer». - что, если это должно быть транзакционным? (например, мне нужно убедиться, что оба клиента и адрес удалены) – HEATH3N

+0

Это очень хороший вопрос! Я думаю, в этом случае имеет смысл иметь адрес как тип значения, связанный с клиентом. Это позволяет манипулировать адресом вместе с клиентом, например. удаление двух. –