Одиночные методы DAO & generic CRUD (JPA / Hibernate + Spring)

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

5 ответов


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

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);
    }
}

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

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

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

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


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


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


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

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

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