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

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

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

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

2 ответа

Решение

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

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

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

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

Смотрите также:

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

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

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

@Repository
public class YourFooDao {

    @Resource
    private SessionFactory sessionFactory;

    private Foo get(long id){
        return (Foo) sessionFactory.getCurrentSession().get(id);
    }
}
Другие вопросы по тегам