2010-10-08 5 views
43

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

ответ

84

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

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

Как бы это согласуется с slsb и pojo (представляющие таблицы db)? – NimChimpsky

+3

Отличный ответ. Несколько комментариев: я скорее передаю класс как параметр в методе конструктора (вместо непроверенного броска); параметр t в методе удаления не должен быть переназначен, и класс предпочтительно будет абстрактным. – megathor

+0

Спасибо !!!!!!!! МНОГО! – verystrongjoe

2

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

5

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

14

Основываясь на статье Don't repeat the DAO, мы использовали этот вид техники в течение многих лет. Мы всегда боролись с проблемами с нашими образцами после того, как поняли, что совершили большую ошибку.

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

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

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

+0

Аннотированное управление транзакциями в EJB ?! Хотя вам, вероятно, нужен гораздо более сложный DAO, который больше не будет общим, но в любом случае. Я по-прежнему считаю, что этот метод может быть полезен в конкретных случаях. –