DAO с Spring и Hibernate

DAO с весны и гибернации

1. обзор

Эта статья покажет, какimplement the DAO with Spring and Hibernate. Для базовой конфигурации Hibernate ознакомьтесь с предыдущей статьейHibernate 5 with Spring.

2. Больше никаких шаблонов Spring

Запуск Spring 3.0 и Hibernate 3.0.1,the Spring HibernateTemplate is no longer necessary для управления сеансом Hibernate. Теперь можно использоватьcontextual sessions -sessions managed directly by Hibernate и активировать их на протяжении всей транзакции.

Как следствие, в настоящее время рекомендуется использовать Hibernate API напрямую вместоHibernateTemplate.. Это эффективно полностью отделит реализацию уровня DAO от Spring.

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

Преобразование исключений было одной из обязанностейHibernateTemplate - перевод низкоуровневых исключений Hibernate на более высокие, общие исключения Spring.

Без шаблона аннотацияthis mechanism is still enabled and activefor all the DAOs annotated with the @Repository. Под капотом здесь используется постпроцессор bean-компонентов Spring, который сообщит всем bean-компонентам@Repository всеPersistenceExceptionTranslator, найденные в контексте Spring.

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

2.2. Управление сеансом гибернации без шаблона

Когда появилась поддержка Hibernate для контекстных сессий,HibernateTemplate по существу устарели. Фактически, Javadoc класса теперь выделяет этот аспект (выделено жирным шрифтом из оригинала):

Note
Начиная с Hibernate 3.0.1, транзакционный код доступа Hibernate также может быть закодирован в простом стиле Hibernate. Следовательно, для недавно начатых проектов рассмотрите возможность принятия стандартного стиля Hibernate3 для кодирования объектов доступа к данным вместо этого на основе \ {@ link org.hibernate.SessionFactory # getCurrentSession ()}.

3. DAO

Мы начнем сthe base DAO – an abstract, parametrized DAO, который поддерживает общие универсальные операции и который мы можем расширить для каждой сущности:

public abstract class AbstractHibernateDAO< T extends Serializable >{
   private Class< T > clazz;

   @Autowired
   private SessionFactory sessionFactory;

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

   public T findOne(long id) {
      return (T) getCurrentSession().get( clazz, id );
   }
   public List< T > findAll() {
      return getCurrentSession()
       .createQuery( "from " + clazz.getName() ).list();
   }

   public void save(T entity) {
      getCurrentSession().persist( entity );
   }

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

   public void delete(T entity) {
      getCurrentSession().delete( entity );
   }
   public void deleteById(long id) {
      final T entity = findOne( id);
      delete( entity );
   }

   protected final Session getCurrentSession(){
      return sessionFactory.getCurrentSession();
   }
}

Здесь интересно несколько аспектов - как уже говорилось, абстрактный DAO не расширяет какой-либо шаблон Spring (например,HibernateTemplate). Вместо этого HibernateSessionFactory вводится непосредственно в DAO и будет играть роль основного API Hibernate через контекстныеSession, которые он предоставляет:

this.sessionFactory.getCurrentSession();

Также обратите внимание, что конструктор получаетClass объекта как параметр, который будет использоваться в общих операциях.

Теперь давайте посмотрим наan example implementation of this DAO для объектаFoo:

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

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

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

В этой статье рассказывается о настройке и реализации уровня сохраняемости с помощью Hibernate и Spring.

Обсуждались причины прекращения использования шаблонов для уровня DAO, а также возможные подводные камни при настройке Spring для управления транзакциями и сеансом Hibernate. Конечный результат - легкая, чистая реализация DAO, практически не зависящая от Spring во время компиляции.

Реализацию этого простого проекта можно найти вthe github project.

Related