Java EE Архитектура - это дао все еще рекомендуется при использовании ORM, как JPA 2?

StackOverflow https://stackoverflow.com/questions/3818589

Вопрос

Если я использую ORM, как JPA2 - где у меня есть свои объекты, которые сопоставлены на мою базу данных, я все еще должен использовать DAO? Кажется, намного больше наверху.

Например, мне нужно будет поддерживать три дополнительных пакета:

  1. Один, который указывает мои доменные объекты (которые в значительной степени отображаются мои объекты сущности):

    public class Employee {
        private String firstName;
        private String lastName;
        ...
        // Getters and setters
    }
    
  2. Тот, который содержит интерфейсы, которые указывают мои методы DAO

    public interface EmployeeDAO {
        public void addEmployee(Employee employee);
        public Employee getEmployeeById(long id);
        ...
    }
    
  3. Тот, который содержит сеансовые бобы, которые реализуют мой дао

    public EmployeeJpaDAO implements EmployeeDAO {
        interface method implementations here
        ....
        private method that transform my Employee entity into my Employee domain object
    }
    

Теперь это много дополнительного багажа, чтобы добавить каждый раз, когда мне нужно выполнить новую операцию CRUD.

Однако преимущества, которые я вижу от DAO:

  1. Вы можете иметь в реализации памяти DAO для тестирования устройства вашего сервисного слоя. Это означает, что вам не нужно получить доступ к базе данных для тестирования бизнес-логики, и вы можете быть уверены, что ваши объекты всегда будут содержать те же значения для свойств

  2. Он отделяет бизнес-логику от логики доступа к базе данных

Опция, которая не включает в себя реализацию 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 убил Дао?. Отказ Смотрите также связанные вопросы ниже:

Связанные вопросы

(...) тот, который содержит сеансовые бобы, которые реализуют мой дао

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, если существует, если нет, то удачи найти в другом месте.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top