Java EE Архитектура - это дао все еще рекомендуется при использовании ORM, как JPA 2?
-
26-09-2019 - |
Вопрос
Если я использую ORM, как JPA2 - где у меня есть свои объекты, которые сопоставлены на мою базу данных, я все еще должен использовать DAO? Кажется, намного больше наверху.
Например, мне нужно будет поддерживать три дополнительных пакета:
Один, который указывает мои доменные объекты (которые в значительной степени отображаются мои объекты сущности):
public class Employee { private String firstName; private String lastName; ... // Getters and setters }
Тот, который содержит интерфейсы, которые указывают мои методы DAO
public interface EmployeeDAO { public void addEmployee(Employee employee); public Employee getEmployeeById(long id); ... }
Тот, который содержит сеансовые бобы, которые реализуют мой дао
public EmployeeJpaDAO implements EmployeeDAO { interface method implementations here .... private method that transform my Employee entity into my Employee domain object }
Теперь это много дополнительного багажа, чтобы добавить каждый раз, когда мне нужно выполнить новую операцию CRUD.
Однако преимущества, которые я вижу от DAO:
Вы можете иметь в реализации памяти DAO для тестирования устройства вашего сервисного слоя. Это означает, что вам не нужно получить доступ к базе данных для тестирования бизнес-логики, и вы можете быть уверены, что ваши объекты всегда будут содержать те же значения для свойств
Он отделяет бизнес-логику от логики доступа к базе данных
Опция, которая не включает в себя реализацию DAO - просто использовать объекты объекта и EntityManager в сервисном слое:
@Stateless
public class EmployeeEjb {
@PersistenceContext(unitName = "employee")
private EntityManager manager;
public Employee getEmployeeById(long id) {
return manager.createNamedQuery(Employee.GetEmployeeById).getResultList();
}
...
}
Здесь нет средней земли? Кто-нибудь столкнулся с архитектурой или реализовал архитектуру, которая соответствует некоторым преимуществам слоя DAO (самое главное, что агрегат позаботенна деловой логики), которые я упомянул выше, но не включает в себя все накладные расходы для реализации слоя DAO?
Спасибо за любые рекомендации и / или предложения! Мне действительно любопытно посмотреть, что некоторые люди придумали в отношении этого.
Решение
Если я использую ORM, как JPA2 - где у меня есть свои объекты, которые сопоставлены на мою базу данных, я все еще должен использовать DAO? Кажется, намного больше наверху.
Это. И ясно, что Java EE не поощряет, используя Дао Узор при использовании JPA (JPA уже предоставляет стандартизированную реализацию Доменное хранилище Узор и не так много ценности на экранировании его за дао). Я нахожу Дао, чтобы бытьСУХОЙ в такой ситуации.
Таким образом, для просто Случаи (фактически, большинство случаев), я счастливо пропускаю дао, и у меня нет проблем с этим. Для большего сложный Шкафы (например, при использовании хранимых процедур, плоские файлы), я бы использовал его. Другими словами, это зависит, как суммируется в JPA убил Дао?. Отказ Смотрите также связанные вопросы ниже:
Связанные вопросы
- Я нашел JPA или одинаково, не поощряю DAO Pattern
- Простой, но хороший шаблон для EJB
- Какова хорошая стратегия для сентиментальных слоев для приложения, которую можно использовать в Интернете и офлайн?
- Использование JSF, JPA и DAO. Без весны?
- Какая подходящая структура DAO с JPA2 / EclipseLink?
(...) тот, который содержит сеансовые бобы, которые реализуют мой дао
NOOOO, вы, безусловно, не хотите реализовать DAO как сессионный боб:
- Вы не хотите создавать столько (объединенного) сессионного боба в качестве таблиц (большие отходы ресурсов)
- Вы не хотите ценить сессию бобов везде, не воспроизводят ошибки из прошлого, это известная плохая практика, которая плохо масштабируется.
Поэтому, если вы действительно хотите пойти на дао, и хотите, чтобы им было введено, либо реализуйте ваши DAOS как весенние бобы (в Java EE 5) или CDI управляемого компонента (в Java EE 6).
Вы можете иметь в реализации памяти DAO для тестирования устройства вашего сервисного слоя.
Если вы действительно хотите сделать единица измерения Тестирование, издевательства Дао / Entitymanager, нет никакой разницы. И если вы хотите выполнить тестирование интеграции, вы можете настроить JPA для использования в базе данных памяти. Так что в конце я просто не покупаю этот аргумент.
Он отделяет бизнес-логику от логики доступа к базе данных
Честно говоря, я не вижу большой Разница между полагающимся на DAO против руководителя сущности, я не вижу, как дао разделите вещи «лучше». Опять же, я не покупаю этот аргумент.
И к моему опыту, изменение базового решения настойчивости - это очень исключительное событие, и я не собираюсь вводить DAOS за то, что очень, скорее всего, не произойдет (Yagni., ЦЕЛОВАТЬ).
Здесь нет средней земли? Кто-нибудь столкнулся с архитектурой или реализовал архитектуру, которая соответствует некоторым преимуществам слоя DAO (самое главное, что агрегат позаботенна деловой логики), которые я упомянул выше, но не включает в себя все накладные расходы для реализации слоя DAO?
Я не вижу большой средней земли и, так как сильно намекаю, я не использую DAOS, если я не буду чувствовать необходимость. И как я сказал, издевающийся EntityManager
Если вы хотите по-настоящему установить тестирование бизнес-логики. Это работает для меня, и я рад пишете меньше кода.
Больше ресурсов
Другие советы
Для записи.
Для одного принципа ответственности (SRP), Дао должен иметь, Он отделяет модель и логику в слое настойчивости, который может быть легко портативным.
Если проект использует тестовый блок, то DAO помогает проверить его правильно (макет, тестирование базы данных и т. Д.).
DAO - это услуга и, как один, мы могли бы обернуть наш процесс в красивом классе, который легко обслуживает.
JPA уменьшает количество строк кодов, но, ничего более, старые правила по-прежнему применяют.
JPA приносит слой репозитория, но его не наш слой репозитория. Отказ В том же принципе, скажем, что мы инкапсулировали логику, которая получила прибыль некоторых процессов. Может быть, инкапсуляция - это просто умножение для 0,1, но ее все еще достойно к инкапсуляции.
Например, скажем, что у меня есть следующая проблема: по какой-то странной причине я могу вставить новый клиент в базу данных? Где я должен начать тестировать? A: ClientDao, если существует, если нет, то удачи найти в другом месте.