Одиночный DAO и общие методы CRUD (JPA / Hibernate + Spring) - PullRequest
45 голосов
/ 08 октября 2010

Следуя моему предыдущему вопросу, Уровни DAO и Service (JPA / Hibernate + Spring) , я решил использовать только один DAO для своего уровня данных (по крайней мере в начале) в приложении, использующем JPAСпящий режим, весна и калитка.Было предложено использование общих методов CRUD, но я не очень уверен, как реализовать это с помощью JPA.Не могли бы вы привести пример или поделиться ссылкой на это?

Ответы [ 5 ]

86 голосов
/ 08 октября 2010

Вот пример интерфейса:

public interface GenericDao<T, PK extends Serializable> {
    T create(T t);
    T read(PK id);
    T update(T t);
    void delete(T t);
}

И реализация:

public class GenericDaoJpaImpl<T, PK extends Serializable> 
    implements GenericDao<T, PK> {

    protected Class<T> entityClass;

    @PersistenceContext
    protected EntityManager entityManager;

    public GenericDaoJpaImpl() {
        ParameterizedType genericSuperclass = (ParameterizedType) getClass()
             .getGenericSuperclass();
        this.entityClass = (Class<T>) genericSuperclass
             .getActualTypeArguments()[0];
    }

    @Override
    public T create(T t) {
        this.entityManager.persist(t);
        return t;
    }

    @Override
    public T read(PK id) {
        return this.entityManager.find(entityClass, id);
    }

    @Override
    public T update(T t) {
        return this.entityManager.merge(t);
    }

    @Override
    public void delete(T t) {
        t = this.entityManager.merge(t);
        this.entityManager.remove(t);
    }
}
14 голосов
/ 01 ноября 2012

На основании статьи Не повторяйте DAO , мы использовали эту технику много лет. Мы всегда боролись с проблемами с нашими моделями после того, как поняли, что допустили большую ошибку.

При использовании инструмента ORM, такого как Hibernate или JPA, вам не придется отдельно рассматривать DAO и уровень службы. Вы можете использовать EntityManager из своих классов обслуживания, поскольку вы знаете жизненный цикл транзакций и логику ваших классов сущностей там.

Вы экономите минуту, если звоните myDao.saveEntity вместо простого entityManager.saveEntity? Нет. У вас будет ненужный класс dao, который больше ничего не делает, но будет оберткой вокруг EntityManager. Не бойтесь писать выбор в ваших классах обслуживания с помощью EntityManager (или сеанса в спящем режиме).

Еще одно замечание: вы должны определить границы вашего сервисного уровня и не позволять программистам возвращать или ждать классов Entity. Программисты уровня UI или WS вообще не должны знать о классах сущностей только о DTO. У сущностных объектов есть жизненные циклы, о которых большинство программистов не знают. У вас будут действительно серьезные проблемы, если вы сохраните объект сущности в данных сеанса и попытаетесь обновить его обратно в базу данных через несколько секунд или часов. Ну, вы можете этого не делать, но программист пользовательского интерфейса, который знает типы параметров и типы возвращаемых данных вашего уровня обслуживания, сделает только несколько строк кода.

5 голосов
/ 10 марта 2011

Я искал то же самое. Я обнаружил, что это именно проект Spring-Data JPA, предоставленный SpringSource. Это кодовый порт из Hades , который теперь (в начале 2011 года) был поглощен Spring и лучше интегрирован. Он позволяет вам использовать один дао (SimpleJpaRepository) со статическим созданием или расширять базовый класс JpaRepository для создания любого конкретного дао объекта с готовыми методами CRUD +. Кроме того, он позволяет выполнять запросы типа grails, просто используя имена параметров в качестве имени метода в интерфейсе (реализация не требуется!), Т.е. findByLastname(String lastName); Выглядит очень многообещающе - участие в проектах Spring, безусловно, обеспечит ему и будущее. Я начал реализовывать это в моем предстоящем проекте сейчас.

2 голосов
/ 03 ноября 2010

если вы ищете стороннюю реализацию, вы можете проверить http://www.altuure.com/projects/yagdao/.это основанная на примечаниях общая структура DAO, которая поддерживает JPA и hibernate

1 голос
/ 06 февраля 2014

Вы также можете посмотреть на http://codeblock.engio.net/data-persistence-and-the-dao-pattern/

Соответствующий код можно найти на github https://github.com/bennidi/daoism

Интеграция с Spring и примеры конфигурации для Hibernate и EclipseLink

...