Что такое/чем отличаются Repository и Dao интерфейсы?

Доброго времени суток.

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

Собственно, почему нельзя транзакции сделать в dao объектах?
И когда, что и зачем нужно использовать?

Ссылки на репозитории приветствуются,
Также можете порекомендовать пару книг :)
  • Вопрос задан
  • 5312 просмотров
Решения вопроса 1
@bromzh
Drugs-driven development
Вот тутор от оракла, там всё поясняют. И ещё вот, например.
А вообще, с названиями классов в яве всегда были разногласия и путаницы. И часто DAO называют то, что им не должно являться.

По смыслу, DAO - довольно низкоуровневая штука, работает напрямую с хранилищем. Для каждого Transfer Object'а (сущности) должна быть реализация DAO для конкретного хранилища.
Например, есть 2 сущности: User и Post. Есть разные хранилища: 2 SQL базы данных (MySql и Postgres), файловая система, хранилище на основе xml-файлов.
Для объекта User есть интерфейс UserDao с методами CRUD. И должны быть 4 реализации этого метода: MySqlUserDao, PostgresUserDao, FileSystemStorageUserDao, XmlFileStorageUserDao. Аналогично для второй сущности. И обычно создаётся фабрика DAO, которая будет выдавать нужную реализацию (по первой ссылке есть схемы). Ну и в силу похожести реализаций, DAO обычно делают абстрактным и типизированным.
Таким образом, получается унифицированный интерфейс для манипуляции данными. Можно прозрачно сменить хранилище просто выбрав другую реализацию DAO (например, через внедрение зависимостей или конфигов), не меняя бизнес-логику.

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

Репозиторий же - это более общая и абстрактная штука.
Вообще, название "репозиторий" обычно встречается в мире спринга, в JavaEE другие термины. Да и суффикс DAO в спринге используется чаще, хотя по смыслу, это не всегда то самое DAO, в толковании Sun/Oracle.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы