Главная » Spring » Создание классов для работы с Hibernate, независимых от Spring

0

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

Листинг 6.7. Контекстные сеансы позволяют определять классы DAO для работы с Hibernate, независимые от Spring

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

import org.hibernate.SessionFactory; import   org.hibernate.classic.Session;

import  org.springframework.beans.factory.annotation.Autowired; import   org.springframework.stereotype.Repository;

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

@Repository

public class HibernateSpitterDao implements SpitterDao { private  SessionFactory  sessionFactory;

@Autowired

public   HibernateSpitterDao(SessionFactory   sessionFactory)   { this.sessionFactory  =  sessionFactory;            // Конструирует  DAO

}

private Session  currentSession() {                   // Извлекает  текущий return  sessionFactory.getCurrentSession();   // сеанс  из  фабрики

}                                                                      // SessionFactory

public  void  addSpitter(Spitter  spitter)  {

currentSession().save(spitter);                      // Использует  текущий  сеанс

}

public Spitter getSpitterById(long id) {      // Использует текущий сеанс return  (Spitter)  currentSession().get(Spitter.class,  id);

}

public  void  saveSpitter(Spitter  spitter)  {   currentSession().update(spitter);                   // Использует  текущий  сеанс

}

}

Относительно фрагмента в листинге 6.7 следует сделать не- сколько замечаний. Во-первых, обратите внимание на использо- вание аннотации Spring @Autowired, вынуждающей Spring автома- тически внедрить SessionFactory в свойство sessionFactory объекта HibernateSpitterDao. Этот объект SessionFactory используется затем в методе currentSession(), чтобы получить ссылку на сеанс для текущей транзакции.

Отметьте также, что класс отмечен аннотацией @Repository. Это позволяет достичь двух целей. Во-первых, @Repository – еще одна стереотипная аннотация в Spring, которая, кроме всего прочего, обнаруживается элементом конфигурации Spring <context:component- scan>. Это означает, что при наличии настроенного элемента <context: component-scan>, как показано ниже, не требуется явно объявлять ком- понент  HibernateSpitterDao:

<context:component-scan

base-package="com.habuma.spitter.persistence"  />

Вторая цель, преследуемая аннотацией @Repository, – уменьшить объем кода разметки XML в файле конфигурации. Напомню, что од- ной из задач класса шаблона являются перехват специфических ис- ключений и их преобразование в неконтролируемые, универсальные исключения Spring. Но как обеспечить такое преобразование после отказа от класса шаблона и перехода к использованию контекстных сеансов Hibernate?

Чтобы добавить преобразование исключений без применения класса шаблона поддержки Hibernate, достаточно просто добавить в контекст приложения Spring компонент PersistenceExceptionTrans- lationPostProcessor:

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

➥PersistenceExceptionTranslationPostProcessor"/>

PersistenceExceptionTranslationPostProcessor – это механизм пост- обработки компонентов, добавляющий объект-советник во все ком- поненты, отмеченные аннотацией @Repository, который будет пере- хватывать все специфические исключения и преобразовывать их в соответствующие неконтролируемые исключения Spring.

На этом реализация Hibernate-версии нашего класса DAO за- канчивается. Нам удалось определить класс, избежав прямой зави- симости от каких-либо классов Spring (за исключением аннотации

@Repository). Аналогичный подход без применения классов шаблонов можно применить при разработке классов DAO на основе JPA. По- этому сделаем еще одно усилие и создадим еще одну реализацию интерфейса SpitterDao, но на этот раз с использованием JPA.

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

По теме:

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