Почему HibernateDaoSupport не рекомендуется?
Недавно я работал с Hibernate 3.5 и Spring 3, я довольно новичок в Hibernate и думал, что класс HibernateDaoSupport
в Spring сделал его приятным и простым в использовании Hibernate с моими доменами.
Однако при поиске несвязанного вопроса я заметил, что кто-то упоминает, что HibernateDaoSupport
не лучший способ использовать Spring и Hibernate. Может ли кто-нибудь пролить свет на:
- Почему это не рекомендуется?
- Каков наилучший (или, по крайней мере, принятый) способ интеграции Hibernate и Spring?
Ответы
Ответ 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);
}
}