JPA и DAO - каков стандартный подход? - PullRequest
6 голосов
/ 07 октября 2010

Я разрабатываю свое первое приложение с JPA / Hibernate и Spring.Моя первая попытка в классе DAO выглядит следующим образом:

@Repository(value = "userDao")
public class UserDaoJpa implements UserDao {
    @PersistenceContext
    private EntityManager em;

    public User getUser(Long id) {
        return em.find(User.class, id);
    }

    public List getUsers() {
        Query query = em.createQuery("select e from User e");
        return query.getResultList();
    }
}

Я также нашел несколько примеров использования JpaDaoSupport и JpaTemplate.Какой дизайн вы предпочитаете?Что-то не так с моим примером?

Ответы [ 4 ]

6 голосов
/ 07 октября 2010

Я бы сказал, что ваш подход выглядит вполне обоснованным. Лично я не использую JpaDaoSupport или JpaTemplate, потому что вы можете делать все, что вам нужно, с помощью EntityManager и критериев запросов.

Цитата из JavaDoc JpaTemplate :

JpaTemplate в основном существует как одно из родственных звеньев JdoTemplate и HibernateTemplate, предлагая тот же стиль для людей, которые к нему привыкли. Для новых проектов рассмотрите возможность принятия стандартного стиля JPA для кодирования объектов доступа к данным вместо этого, основываясь на ссылке «shared EntityManager», введенной через определение bean-компонента Spring или аннотацию JPA PersistenceContext.

4 голосов
/ 07 октября 2010

Я предпочитаю подход без шаблонов (т.е. ваш текущий подход), потому что

  • он менее инвазивен, вы не привязываете DAO к Spring
  • шаблоны не предлагают многозначение с API, которые используют непроверенные исключения

И это рекомендация Spring, кратко изложенная в сообщении в блоге " Так что вы все равно должны использовать Spring HibernateTemplate и / или JpaTemplate ?? "и официальный javadoc:

Реальный вопрос: какой подход выбрать ??

(...)

Короче говоря (как JavaDoc дляHibernateTemplate и JpaTemplate уже упоминалось) Я бы порекомендовал вам начать использовать API Session и / или EntityManager напрямую, если вы начинаете использовать Hibernate или JPA соответственно на новомПроект - помните: Spring пытается быть неинвазивным, это еще один отличный пример!

2 голосов
/ 07 октября 2010

Я лично предпочитаю ваш подход - введите EntityManager и используйте его напрямую. Но JpaTemplate тоже хороший вариант. Мне это не нравится, потому что добавляет еще один ненужный слой абстракции.

1 голос
/ 07 октября 2010

Я не знаю, есть ли «стандартный» подход.

Если вы используете JPA, у вас есть выбор реализации: Hibernate, TopLink и т. Д.

При развертывании в Google App Engine вы будете использовать JPA для общения с BigTable.

Поэтому, если ваши цели состоят в том, чтобы максимизировать переносимость, придерживайтесь стандарта JPA и не привязывайте себя к конкретной реализации, такой как Hibernate, убедитесь, что ваши DAO используют только конструкции JPA.

...