У меня есть компонент, который должен обновить базу данных для клиента и адреса клиента (через JDBC). Уместно ли вызывать CustomerAddressDAO из CustomerDAO? Или создать отдельный компонент CustomerDataManager, который вызывает их отдельно?Может ли DAO позвонить DAO?
ответ
Вы можете сделать это, но это не значит, что вам следует. В этих случаях мне нравится использовать Сервис (CustomerService
в этом случае), который имеет вызов метода, который использует оба DAO. Вы можете определить транзакцию вокруг метода службы, поэтому, если один вызов завершится с ошибкой, они оба откатываются.
Проблема с DAO, вызывающими другие DAO, вы быстро получите в итоге круглые ссылки. Инъекционная инъекция становится намного сложнее.
Вы можете позвонить в один DAO из другого, а также рассмотреть возможность создания CustomerAddressDAO в CustomerDAO (в конце концов, речь идет о клиенте, и я не думаю, что вы хотите иметь адрес клиента без клиента).
Очевидно, что вы можете сделать это по-разному. Но, чтобы правильно ответить на этот вопрос, вы должны начать с вашей модели. В модели см. «Адрес - это объект» (что-то с его собственным идентификатором и используется также независимо), или это тип значения (что имеет смысл только в контексте Клиента. Затем у вас будет два случая:
Адрес является Entity: в этом случае, адрес имеет свой собственный Dao и Клиент имеет свой собственный Dao Ни Dao должен получить доступ к другой, если есть какая-то логика, которая должна управлять два, то, что.. должен находиться в вашей логике приложения, а не в уровне доступа к данным.
Адрес - тип значения, связанный с Заказчиком: В этом случае адрес не имеет отдельного DAO его низкая частота Он сохраняется/восстанавливается как часть объекта Customer.
Заключение: При надлежащем проектировании DAO не имеют доступа друг к другу (в стандартных ситуациях).
«Если есть какая-то логика, которая должна управлять этими двумя, то это должно быть в вашей логике приложения, а не в Data Access Layer». - что, если это должно быть транзакционным? (например, мне нужно убедиться, что оба клиента и адрес удалены) – HEATH3N
Это очень хороший вопрос! Я думаю, в этом случае имеет смысл иметь адрес как тип значения, связанный с клиентом. Это позволяет манипулировать адресом вместе с клиентом, например. удаление двух. –
Что блокирует вас от этого в бизнес-слое? – Andre