Автор оригинала: 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, поэтому его должно быть легко импортировать и запускать как есть.