Главная » Spring » Объект DAO на основе JPA

0

Подобно всем остальным модулям Spring интеграции с механиз- мами хранения данных, модуль Spring JPA реализован в форме клас- са шаблона JpaTemplate и соответствующего ему класса поддержки JpaDaoSupport. Однако мы не будем рассматривать приемы исполь- зования JPA на основе шаблона и отдадим предпочтение подходу, основанному на применении JPA без тесной связи с фреймворком Spring. Этот подход можно сравнить с контекстными сеансами Hibernate, которые использовались в разделе 6.4.3.

Поскольку нас больше интересует подход к использованию JPA без тесной связи с фреймворком Spring, в этом разделе мы сфо- кусируемся на создании объектов JPA DAO, также не связанных с фреймворком Spring. В частности, в листинге 6.8 представлен класс JpaSpitterDao, не использующий шаблона JpaTemplate.

Листинг 6.8. Объект JPA DAO, не использующий шаблонов Spring

package  com.habuma.spitter.persistence; import    java.util.List;

import   javax.persistence.EntityManager; import javax.persistence.PersistenceContext;

import   org.springframework.dao.DataAccessException; import   org.springframework.stereotype.Repository;

import     org.springframework.transaction.annotation.Transactional;

import  com.habuma.spitter.domain.Spitter; import   com.habuma.spitter.domain.Spittle;

@Repository("spitterDao")

@Transactional

public class JpaSpitterDao implements SpitterDao { private static final String RECENT_SPITTLES =

"SELECT  s FROM  Spittle s";

private static final String ALL_SPITTERS  = "SELECT s FROM Spitter s";

private static final String SPITTER_FOR_USERNAME =

"SELECT  s  FROM  Spitter  s  WHERE  s.username  =  :username"; private  static  final  String  SPITTLES_BY_USERNAME  =

"SELECT  s FROM  Spittle s WHERE  s.spitter.username =  :username";

@PersistenceContext

private  EntityManager  em;                                // Для  внедрения  EntityManager

public  void  addSpitter(Spitter  spitter)  {

em.persist(spitter);                              // Использование EntityManager

}

public  Spitter  getSpitterById(long  id)  {

return em.find(Spitter.class, id);          // Использование EntityManager

}

public  void  saveSpitter(Spitter  spitter)  {

em.merge(spitter);                                 // Использование EntityManager

}

}

Для взаимодействия с хранилищем класс JpaSpitterDao использу- ет EntityManager. Благодаря использованию EntityManager объект DAO остается независимым от фреймворка Spring и напоминает объекты DAO, которые можно встретить в приложениях, не использующих фреймворка Spring. Но как он получает экземпляр EntityManager?

Обратите внимание, что свойство em отмечено аннотацией @Persis- tentContext. Эта аннотация явно указывает, что в свойство em должен быть внедрен экземпляр EntityManager. Чтобы обеспечить внедрение EntityManager средствами Spring, необходимо сконфигурировать ком- понент PersistenceAnnotationBeanPostProcessor в контексте приложения Spring:

<bean  class="org.springframework.orm.jpa.support.

➥PersistenceAnnotationBeanPostProcessor"/>

Возможно, вы также заметили, что класс JpaSpitterDao отмечен ан- нотациями @Repository и @Transactional. Аннотация @Transactional ука- зывает, что методы взаимодействий с хранилищем в этом объекте DAO будут выполняться в контексте транзакций. Подробнее об ан- нотации @Transactional будет рассказываться в следующей главе, где будет обсуждаться поддержка декларативных транзакций в Spring.

Что касается аннотации @Repository, здесь она служит той же цели, что и в примере реализации DAO с использованием контекстных сеансов Hibernate. В отсутствие шаблона, выполняющего преобразо- вание исключений, необходимо использовать аннотацию @Repository, чтобы компонент PersistenceExceptionTranslationPostProcessor знал, что это один из компонентов, требующих преобразования специализи- рованных исключений в универсальные исключения Spring.

Говоря о PersistenceExceptionTranslationPostProcessor, следует пом- нить, что его необходимо настроить как компонент Spring, как это делалось в примере с Hibernate:

<bean  class="org.springframework.dao.annotation.

➥PersistenceExceptionTranslationPostProcessor"/>

Обратите внимание, что преобразование исключений при исполь- зовании JPA или Hibernate не является обязательным требованием. Если вы предпочитаете получать исключения, специфические для JPA или Hibernate, тогда просто опустите настройку компонента PersistenceExceptionTranslationPostProcessor и используйте специали- зированные исключения. Но помните, что использование механиз- ма преобразования исключений в Spring обеспечивает унификацию всех исключений доступа к данным, что упростит замену одних ме- ханизмов хранения данных другими.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии