DAO и сервисный уровень в Spring: управление сессиями - PullRequest
3 голосов
/ 02 апреля 2010

Прав ли я в понимании принципов взаимосвязи DAO и сервисного уровня? DAO выполняет извлечение базовых объектов, скажем, по идентификатору из базы данных.

Сервисный уровень ИСПОЛЬЗУЕТ объект DAO и может вызывать БОЛЕЕ ОДИН СПОСОБ DAO в одной функции Итак, Сервисный слой должен:

  1. создание экземпляра объекта реализации DAO

  2. вызывать столько методов DAO, сколько необходимо

Если Dao реализует интерфейс, то должен ли интерфейс DAO иметь метод setSessionFactory()?

Как декларативно отметить весной:

  1. объект DAO

  2. Методы уровня обслуживания и класс в целом

чтобы он дал то что нужно?

Ответы [ 3 ]

7 голосов
/ 02 апреля 2010

Я удивлен, что никто другой специально не упомянул об этом, но детали реализации, такие как setSessionFactory(), должны , а не быть в вашем интерфейсе DAO. Добавляя класс Hibernate в интерфейс DAO, вы привязываете свои DAO непосредственно к Hibernate.

Цель использования интерфейсов и внедрения зависимостей состоит в том, чтобы позволить вам изменить детали реализации (например, какое решение ORM вы используете, или если ваши данные поступают из веб-службы по сравнению с базой данных) уровня (вашего DAO) без воздействия на другие слои.

Если вы добавите setSessionFactory к своему интерфейсу DAO, то все остальные уровни, использующие этот DAO, станут осведомленными и связанными с тем фактом, что доступ к данным осуществляется через Hibernate. Это прямо противоположно тому, чего вы пытаетесь достичь с помощью интерфейсов и внедрения зависимостей.

4 голосов
/ 02 апреля 2010

Для моих проектов я пишу базовый класс, который имеет метод setSessionFactory(), который расширяет все мои DAO. Затем я связываю свои DAO с Spring, чтобы они вводили SessionFactory в каждый DAO.

Hibernate имеет SessionFactory.getCurrentSession(), поэтому, если вы введете SessionFactory в свои DAO и используете этот метод, тогда область действия Session будет определяться в соответствии с вашим механизмом управления транзакциями.

Что это значит, если у вас есть метод как таковой:

@Transactional
public void doSomething(){
    dao1.makeCall();
    dao2.makeOtherCall();
}

SessionFactory, который вы вводите в каждый DAO при построении, будет использовать тот же Session. Но только для объема этой сделки.

2 голосов
/ 02 апреля 2010
  • Оставьте управление транзакциями и сеансами весной (через встроенные менеджеры транзакций).
  • В ваших DAO используйте sessionFactory.getCurrentSession() tp доступ к сеансу
  • вводят SessionFactory в DAO.
  • имеют DAO в области действия singleton
  • использовать декларативные транзакции (либо с <aop, либо с @Transactional)
  • DAO внедряется в объекты службы посредством регулярного внедрения зависимостей. Так же, как сервисные классы вводятся там, где они необходимы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...