Может ли DAO позвонить в DAO? - PullRequest
14 голосов
/ 24 января 2012

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

Ответы [ 3 ]

27 голосов
/ 24 января 2012

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

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

4 голосов
/ 28 ноября 2012

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

  1. Адрес является объектом: В этом случае у Address есть свой Dao, а у Customer - Dao. Ни один Дао не должен получить доступ к другому. Если есть какая-то логика, которой нужно манипулировать этими двумя, то это должно быть в логике вашего приложения, а не на уровне доступа к данным.

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

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

4 голосов
/ 24 января 2012

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

...