Советы по использованию DAO / Spring MVC / Hibernate - PullRequest
1 голос
/ 14 июля 2011

Я пытаюсь получить четкое представление о том, как это работает:

-В чем преимущество использования класса DAO с интерфейсом DAO?
-Как обрабатывать исключения Hibernate, т.е.

public String doSomething(){
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();

      Query query = session.createQuery("");

    Object o = query.uniqueResult();

    session.close();

    return "success";
}

Я не "вынужден" пытаться / ловить, так как мне ловить / перехватывать любые исключения, которые могут возникнуть?

- Открывать ли сеанс каждый раз для нового метода DAO дороже, чем получать текущий сеанс? Должен ли я закрыть сессию, если я использую get?

Обновление вопроса:

У меня есть аннотация @Service в моих классах обслуживания, и для каждого метода, использующего интерфейс dao, у меня есть @Transactional выше. Также я добавил @Repository ко всем моим классам DAO

Обновление II:

Я рассматриваю возможность открытия щедрости за эти вопросы, потому что я хочу знать больше деталей, и на этот раз я предоставлю некоторые.

  1. Весенний контекст
  2. Контроллер
  3. Сервисный интерфейс
  4. Внедрение услуги
  5. Интерфейс DAO
  6. Реализация DAO

Итак, я хочу максимально использовать Spring MVC, как сделать так, чтобы @Transactional обрабатывал открытие / закрытие сессии?

Как перехватить исключения (т. Е. Несуществующая запись или сбой базы данных), если таковые имеются.

Что я делаю не так? Кто-нибудь может предложить некоторые улучшения?

Ответы [ 2 ]

7 голосов
/ 14 июля 2011

Несколько вещей о спящем сеансе ...

1.) Я хотел бы взглянуть на интеграцию Spring * управления транзакциями в ваш проект.Таким образом, вам не нужно беспокоиться об открытии и закрытии сессии, потому что Spring будет обрабатывать это для вас с помощью перехватов с помощью аннотации @Transactional.

2.) Если Spring обрабатывает ваши транзакции, у вас не будетбеспокоиться о выполнении вызовов finally, чтобы убедиться, что все закрыто или откатано.

3.) Если вы решите не использовать Spring для управления сеансами, вы должны , а не оставить его открытым длялюбой продолжительный период времени, но опять же, если вы используете Spring, вам не нужно об этом беспокоиться.

Что касается интерфейса классов DAO, я предлагаю это ...

1.) Кодирование интерфейсов считается хорошей практикой проектирования (см. Комментарии ниже), и здесь есть несколько веских причин, почему.

Допустим, у вас есть ...

public interface ShoppingCartService{

    public void doStuff(Object obj);

} 

Вы можете представить эту службу как сервлет и иметь дело только с тем «контрактом», который создает ваш интерфейс, или даже скрыть тот факт, что вы используетеHibnerate, JDBC или что-нибудь еще ...

@Service
public class PetShopShoppingCartService implements ShoppingCartService{

    @Transactional(propagation=Propagation.REQUIRED)
    public void doStuff(Object obj){
        //The Pet Shop service impl uses hibernate!;
    }
}

или ...

public class DrugStoreShoppingCartService implements ShoppingCartService{

    public void doStuff(Object obj){
        //The Drug Store service uses JDBC;
    }
}

Или даже ...

public class NextBigThingShoppingCartService implements ShoppingCartService{

    public void doStuff(Object obj){
        //do stuff with next big thing;
    }
}

Я думаю, вы получитекартина.Если вы разрабатываете публичные API или предоставляете сервисы, это становится довольно важным.

Наконец, еще одна веская причина для создания интерфейсов - работа в команде из более чем нескольких разработчиков.Вы можете быстро заглушить интерфейс, зарегистрироваться и сообщить всем остальным, что так оно и будет выглядеть.Это позволяет им видеть, что важно, и даже высмеивать их собственные значения, если им нужно (ThingServiceMockDataImpl)

0 голосов
/ 14 июля 2011

То, что вы не обязаны перехватывать исключения при использовании Spring HibernateTemplate, не означает, что они не будут выброшены. Они будут просто RuntimeException с вместо проверенных исключений. Кроме того, getCurrentSession() не открывает новый сеанс каждый раз, когда вы вызываете его, он возвращает сеанс локального потока.

Существует множество преимуществ, в том числе отсутствие связывания кода, инкапсуляция и разграничение транзакций для использования стратегии DAO вместо того, чтобы вводить код доступа к данным непосредственно в контроллер. См. http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...