У меня есть компонент, который должен обновлять базу данных для клиента и адреса клиента (через JDBC). Уместно ли вызывать CustomerAddressDAO из CustomerDAO? Или создать отдельный компонент CustomerDataManager, который вызывает их отдельно?
Может ли DAO называть DAO?
Ответ 1
Вы можете это сделать, но это не значит, что вам нужно. В этих случаях мне нравится использовать Сервис (CustomerService
в этом случае), который имеет вызов метода, который использует оба DAO. Вы можете определить транзакцию вокруг метода службы, поэтому, если один вызов не удался, они оба откатываются.
Проблема с DAO, которая вызывает другие DAO, - это вы быстро получите круговые ссылки. Инъекционная инъекция становится намного сложнее.
Ответ 2
Вы можете вызвать один DAO из другого, а также рассмотреть возможность создания CustomerAddressDAO в CustomerDAO (в конце концов, это о клиенте, и я не думаю, что вы хотите иметь адрес клиента без клиента).
Ответ 3
Очевидно, вы можете сделать это по-разному. Но, чтобы правильно ответить на этот вопрос, вы должны начать с вашей модели. В модели смотрите, если Address является Entity (что-то с его собственным идентификатором и используется также независимо), или это тип значения (что имеет смысл только в контексте Клиента). Тогда у вас будет два случая:
-
Адрес - это объект: В этом случае адрес имеет собственный Дао, а у Клиента есть собственный Дао. Ни Дао не должны обращаться к другому. Если есть некоторая логика, которая должна управлять этими двумя, то это должно быть в вашей логике приложения, а не в Уровне доступа к данным.
-
Адрес - тип значения, связанный с клиентом: В этом случае адрес не имеет отдельного DAO. Он сохраняется/восстанавливается как часть содержащего объекта Customer.
Заключение: если они правильно разработаны, DAO не имеют доступа друг к другу (в стандартных ситуациях).