web-dev-qa-db-fra.com

Pourquoi HibernateDaoSupport n'est-il pas recommandé?

J'ai récemment travaillé avec Hibernate 3.5 et Spring 3, je suis assez nouveau avec Hibernate et je pensais que la classe HibernateDaoSupport de Spring rendait Hibernate agréable et facile à utiliser avec mes classes de domaine.

Cependant, lors de la recherche d'une question non liée, j'ai vu quelqu'un mentionner que le HibernateDaoSupport n'est pas la meilleure façon d'utiliser Spring et Hibernate. Quelqu'un peut-il nous éclairer:

  • Pourquoi n'est-il pas recommandé?
  • Quelle est la meilleure (ou du moins la meilleure façon) d'intégrer Hibernate et Spring?
67
C0deAttack

L'utilisation de HibernateDaoSupport/HibernateTemplate n'est pas recommandée car elle lie inutilement votre code aux classes Spring.

L'utilisation de ces classes était inévitable avec les anciennes versions d'Hibernate afin d'intégrer la prise en charge des transactions gérées par Spring.

Cependant, depuis Hibernate 3.0.1, vous n'en avez plus besoin - vous pouvez écrire un code sur une API Hibernate standard tout en utilisant des transactions gérées par Spring. Tout ce dont vous avez besoin est de configurer la prise en charge des transactions Spring, d'injecter SessionFactory et d'appeler getCurrentSession() dessus lorsque vous devez travailler avec la session.

Un autre avantage de HibernateTemplate est la traduction d'exceptions. Sans HibernateTemplate, la même fonctionnalité peut être obtenue en utilisant @Repository annotation, comme le montre la réponse de Gareth Davis.

Voir aussi:

90
axtavt

Pour mon argent, il n'y a rien de mal à utiliser HibernateDaoSupport. Il n'est pas obsolète au printemps 3.0.

Pouvez-vous fournir le numéro de question que vous avez trouvé, il se peut qu'ils se réfèrent à un cas d'utilisation très spécifique.

L'alternative est d'utiliser le @Repository annotation. Cela va câbler la même traduction d'exception (l'un des gros avantages de HibernateTemplate) et vous permet soit d'utiliser votre propre super classe, soit tout simplement pour éviter d'étendre une classe de framework tiers.

@Repository
public class YourFooDao {

    @Resource
    private SessionFactory sessionFactory;

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