Подтвердить что ты не робот

Почему HibernateDaoSupport не рекомендуется?

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

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

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

Ответ 1

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

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

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

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

См. также:

Ответ 2

За свои деньги нет ничего плохого в использовании HibernateDaoSupport. Он не устарел в spring 3.0.

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

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

@Repository
public class YourFooDao {

    @Resource
    private SessionFactory sessionFactory;

    private Foo get(long id){
        return (Foo) sessionFactory.getCurrentSession().get(id);
    }
}