Рубрики
Без рубрики

ДАО с JPA и Spring

Как реализовать DAO с помощью JPA в весеннем проекте.

Автор оригинала: Eugen Paraschiv.

1. Обзор

В этой статье будет показано, как реализовать DAO с помощью Spring и JPA . Для базовой конфигурации JPA см. статью о JPA с Spring.

2. Больше Никаких Весенних Шаблонов

Начиная с Spring 3.1, JpaTemplate и соответствующий JpaDaoSupport были устарели в пользу использования собственного API сохранения Java.

Кроме того, оба этих класса актуальны только для JPA 1 (из JpaTemplate javadoc):

Обратите внимание, что этот класс не был обновлен до JPA 2.0 и никогда не будет обновлен.

Как следствие, в настоящее время рекомендуется использовать API сохранения Java напрямую вместо JpaTemplate .

2.1. Перевод исключений Без шаблона

Одной из обязанностей JpaTemplate был перевод исключений – перевод исключений низкого уровня в исключения более высокого уровня, общие исключения Spring.

Без шаблона перевод исключений по-прежнему включен и полностью функционален для всех DAO, аннотированных @Repository . Spring реализует это с помощью beanpostprocessor, который сообщит всем @Repository beans со всеми PersistenceExceptionTranslator , найденными в контейнере.

Также важно отметить, что механизм трансляции исключений использует прокси – серверы – для того, чтобы Spring мог создавать прокси-серверы вокруг классов DAO, они не должны быть объявлены final .

3. ДАО

Во – первых, мы реализуем базовый уровень для всех DAO-абстрактный класс, использующий универсалии и предназначенный для расширения:

public abstract class AbstractJpaDAO< T extends Serializable > {

   private Class< T > clazz;

   @PersistenceContext
   EntityManager entityManager;

   public final void setClazz( Class< T > clazzToSet ){
      this.clazz = clazzToSet;
   }

   public T findOne( long id ){
      return entityManager.find( clazz, id );
   }
   public List< T > findAll(){
      return entityManager.createQuery( "from " + clazz.getName() )
       .getResultList();
   }

   public void create( T entity ){
      entityManager.persist( entity );
   }

   public T update( T entity ){
      return entityManager.merge( entity );
   }

   public void delete( T entity ){
      entityManager.remove( entity );
   }
   public void deleteById( long entityId ){
      T entity = findOne( entityId );
      delete( entity );
   }
}

Основной интересный аспект здесь заключается в том, как | EntityManager вводится – с использованием стандартной @PersistenceContext аннотации. Под капотом это обрабатывается PersistenceAnnotationBeanPostProcessor – который обрабатывает аннотацию, извлекает диспетчер сущностей JPA из содержимого и вводит его.

Постпроцессор персистентности создается либо явно, определяя его в конфигурации, либо автоматически, определяя context:annotation-config или context:component-scan в конфигурации пространства имен.

Кроме того, обратите внимание, что сущность Class передается в конструкторе для использования в универсальных операциях:

@Repository
public class FooDAO extends AbstractJPADAO< Foo > implements IFooDAO{

   public FooDAO(){
      setClazz(Foo.class );
   }
}

4. Заключение

Этот учебник иллюстрирует как настроить слой DAO с помощью Spring и JPA , используя конфигурацию на основе XML и Java. Мы также обсудили, почему не следует использовать JpaTemplate и как заменить его EntityManager . Конечным результатом является легкая, чистая реализация DAO, практически не зависящая от Spring во время компиляции.

Реализацию этого простого проекта можно найти в проекте GitHub – это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.