Почему HibernateDaoSupport не рекомендуется? - PullRequest
67 голосов
/ 24 февраля 2011

Недавно я немного поработал с Hibernate 3.5 и Spring 3, я довольно новичок в Hibernate и думал, что класс HibernateDaoSupport в Spring делает его удобным и простым в использовании Hibernate с моими классами домена.

Однако при поиске несвязанного вопроса я заметил, что кто-то упомянул, что HibernateDaoSupport - не лучший способ использовать Spring и Hibernate. Может ли кто-нибудь пролить свет на:

  • Почему это не рекомендуется?
  • Каков наилучший (или, по крайней мере, принятый) способ интеграции Hibernate и Spring?

Ответы [ 2 ]

90 голосов
/ 24 февраля 2011

Использование HibernateDaoSupport / HibernateTemplate не рекомендуется, поскольку излишне привязывает ваш код к классам Spring.

Использование этих классов было неизбежно в более старых версиях Hibernate для интеграции поддержки транзакций, управляемых Spring..

Однако, начиная с Hibernate 3.0.1, он вам больше не нужен - вы можете написать код для простого API Hibernate при использовании транзакций, управляемых Spring.Все, что вам нужно, это настроить поддержку транзакций Spring, ввести SessionFactory и вызвать getCurrentSession(), когда вам нужно работать с сессией.

Еще одним преимуществом HibernateTemplate является перевод исключений.Без HibernateTemplate та же функциональность может быть достигнута с помощью аннотации @Repository, как показано в ответе Гарета Дэвиса.

См. Также:

18 голосов
/ 24 февраля 2011

За мои деньги нет ничего плохого в использовании HibernateDaoSupport.Весной 3.0 это не устарело.

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

Альтернатива заключается в использовании @Repository аннотация.Это приведет к тому же переводу исключений (одно из больших преимуществ HibernateTemplate) и позволит вам либо использовать свой собственный суперкласс, либо просто избегать расширения стороннего каркасного класса.

@Repository
public class YourFooDao {

    @Resource
    private SessionFactory sessionFactory;

    private Foo get(long id){
        return (Foo) sessionFactory.getCurrentSession().get(id);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...