Если я использую ORM, такой как JPA2 - где у меня есть сущности, которые сопоставлены с моей базой данных, должен ли я по-прежнему использовать DAO? Похоже, намного больше накладных расходов.
Это так. И, разумеется, Java EE не поощряет использование шаблона DAO при использовании JPA (JPA уже предоставляет стандартизированную реализацию шаблона Domain Store и не имеет особой ценности для его защиты за ДАО). Я считаю, что DAO в таких ситуациях против DRY .
Так что для простых случаев (на самом деле, в большинстве случаев) я с радостью пропускаю DAO, и у меня нет проблем с этим. Для более сложных случаев (например, при использовании хранимых процедур, плоских файлов) я бы использовал его. Другими словами, это зависит от того, как это обобщено в Убил ли JPA DAO? . См. Также связанные вопросы ниже:
Похожие вопросы
(...) Тот, который содержит сессионные компоненты, которые реализуют мой DAO
Нееееет, вы определенно не хотите реализовывать DAO в качестве сессионного компонента:
- Вы не хотите создавать столько (Sooled) Session Bean, сколько таблиц (большая трата ресурсов)
- Вы не хотите связывать Session Beans повсюду, не воспроизводите ошибок из прошлого, это известная плохая практика, которая плохо масштабируется.
Так что, если вы действительно хотите пойти по пути DAO и хотите, чтобы EM внедрялся, либо реализуйте свои DAO как Spring bean (в Java EE 5), либо как управляемый bean CDI (в Java EE 6).
У вас может быть реализация DAO в памяти для модульного тестирования уровня обслуживания.
Если вы действительно хотите провести тестирование unit , смоделируйте DAO / EntityManager, разницы нет. А если вы хотите провести интеграционное тестирование, вы можете настроить JPA на использование базы данных в памяти. Поэтому в конце я просто не покупаю этот аргумент.
отделяет бизнес-логику от логики доступа к базе данных
Честно говоря, я не вижу большой разницы между положением в DAO и менеджером сущностей, я не вижу, как DAO разделяет вещи "лучше". Опять же, я не покупаю этот аргумент.
И, по моему опыту, изменение базового решения для персистентности является очень исключительным событием, и я не собираюсь представлять DAO для чего-то, что, скорее всего, не произойдет ( YAGNI , KISS * * 1078). * * 1079
Здесь нет никакого среднего уровня? Кто-нибудь сталкивался с архитектурой или реализовал архитектуру, которая удовлетворяет некоторым из преимуществ уровня DAO (наиболее важно модульная тестируемость бизнес-логики), о которых я упоминал выше, но не включает все накладные расходы, связанные с реализацией уровня DAO?
Я не вижу среднего уровня и, как намекает я, я не использую DAO, если не чувствую в этом необходимости. И, как я уже сказал, смейтесь на EntityManager
, если вы хотите по-настоящему модульного тестирования бизнес-логики. Это работает для меня, и я счастлив писать меньше кода.
Больше ресурсов
JPA / EJB3 убили DAO
DAO не мертвы - но они либо рухнули, либо исчезли
... И, наконец, вы должны ввести DAO, если: