68 votes

HibernateDaoSupport n'est pas recommandé, pourquoi ?

J'ai récemment travaillé avec Hibernate 3.5 et Spring 3. Je suis assez novice avec Hibernate et j'ai pensé que la classe HibernateDaoSupport de Spring permettait d'utiliser Hibernate facilement avec mes classes de domaine.

Cependant, en cherchant une question sans rapport, 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 m'éclairer à ce sujet ?

  • A) Pourquoi n'est-il pas recommandé ?
  • B) La meilleure (ou du moins la manière acceptée) d'intégrer Hibernate et Spring ?

Merci.

91voto

axtavt Points 126632

Utilisation de HibernateDaoSupport / HibernateTemplate n'est pas recommandé car il 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 le support des transactions gérées par Spring.

Cependant, depuis Hibernate 3.0.1, vous n'en avez plus besoin - vous pouvez écrire un code contre une API Hibernate simple tout en utilisant des transactions gérées par Spring. Il vous suffit de configurer le support des transactions de Spring, d'injecter SessionFactory et appeler getCurrentSession() sur elle lorsque vous devez travailler avec la session.

Un autre avantage de HibernateTemplate est une traduction d'exception. Sans HibernateTemplate la même fonctionnalité peut être obtenue en utilisant @Repository comme indiqué dans la réponse de Gareth Davis.

Voir aussi :

18voto

Gareth Davis Points 16190

Pour moi, il n'y a rien de mal à utiliser HibernateDaoSupport . Il n'est pas déprécié dans spring 3.0.

Pouvez-vous fournir le numéro de la question que vous avez trouvée, 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 se traduira par la même traduction des exceptions (l'un des grands avantages de l'annotation HibernateTemplate ) et vous permettent d'utiliser votre propre super classe ou tout simplement d'é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);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X