Ответ 1
Если я использую ORM, например JPA2 - где у меня есть объекты, которые сопоставлены с моей базой данных, должен ли я использовать DAO? Это кажется намного более накладными расходами.
Это. И, очевидно, Java EE не поощряет использование шаблона DAO при использовании JPA (JPA уже предоставляет стандартизованную реализацию Магазин доменов, и при его закрытии за DAO не так много значения. Я считаю, что DAO будет анти-DRY в такой ситуации.
Итак, для простых случаев (фактически, в большинстве случаев) я с радостью пропустил DAO, и у меня нет проблем с этим. Для более сложных случаев (например, при использовании хранимых процедур, плоских файлов) я бы использовал его. Другими словами, это зависит от того, как суммировано в Неужели JPA убил DAO?. См. Также следующие вопросы:
Связанные вопросы
- Я обнаружил, что JPA, или, похоже, не поощряет шаблон DAO
- Простой, но хороший шаблон для EJB
- Какова хорошая стратегия для разделения слоев для приложения, которое можно использовать онлайн и офлайн?
- Использование JSF, JPA и DAO. Без Spring?
- Какая подходящая структура DAO с jpa2/eclipselink?
(...) Тот, который содержит сеанс beans, который реализует мои DAO
Noooo, вы, разумеется, не хотите реализовывать DAO как сеанс Bean:
- Вы не хотите создавать столько (объединенного) сеанса Bean как таблицы (большая трата ресурсов)
- Вы не хотите всю цепочку сеансов beans, не воспроизводите ошибки из прошлого, это известная плохая практика, которая плохо масштабируется.
Итак, если вы действительно хотите пойти по пути DAO и хотите, чтобы EM была введена, либо реализуйте свои DAO как Spring beans (в Java EE 5) или управляемый CDI Bean (в Java EE 6),
У вас может быть реализация DAO в памяти для модульного тестирования вашего уровня обслуживания.
Если вы действительно хотите провести тестирование unit, издевайтесь над DAO/EntityManager, нет никакой разницы. И если вы хотите выполнить интеграционное тестирование, вы можете настроить JPA на использование базы данных в памяти. Поэтому в конце я просто не покупаю этот аргумент.
Отделяет бизнес-логику от логики доступа к базе данных
Честно говоря, я не вижу разницы большой между полагающейся на DAO и менеджером сущности, я не вижу, как DAO отдельные вещи "лучше". Опять же, я не покупаю этот аргумент.
И, по моему опыту, изменение базового решения настойчивости является очень исключительным событием, и я не собираюсь вводить DAO для чего-то, что, скорее всего, не произойдет (YAGNI, KISS).
Нет ли здесь среднего места? Кто-нибудь сталкивался с архитектурой или реализовал архитектуру, которая удовлетворяет некоторым преимуществам уровня DAO (что наиболее важно для тестируемой бизнес-логики), о котором я упоминал выше, но не включает в себя все накладные расходы, связанные с внедрением уровня DAO?
Я не вижу много места и, как сильно намекнул, я не использую DAO, если я не чувствую нужды. И, как я уже сказал, высмеиваем EntityManager
, если вы хотите по-настоящему unit test бизнес-логики. Он работает для меня, и я счастлив написать меньше кода.