IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Spring Hibernate et Criteria [Data]


Sujet :

Spring Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Par défaut Spring Hibernate et Criteria
    Bonjour,

    J'ai depuis toujours utilisé les Criteria hibernate et je trouve cela plus clair que le HQL (mais bon, chacun ses gouts). Voici un exemple de code que j'ai toujours utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class InstitutionDAOImpl extends HibernateDaoSupport implements InstitutionDAO {
     
        /** {@inheritDoc} */
        @SuppressWarnings("unchecked")
        public List<Institution> getAllSortedInstitution() {
            Criteria criteria = getSession().createCriteria(Institution.class);
            criteria.addOrder(Order.asc("name"));
            return criteria.list();
        }
    Je me suis récemment laissé dire que c'était une mauvaise manière de coder, notamment parce qu'on est pas certain que la session retournée par getSession() soit bien fermée après. A la place, on me suggère d'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        public List<Institution> getAllSortedInstitution() {
            return (List<Institution>) getHibernateTemplate().execute(new HibernateCallback() {
                public Object doInHibernate(Session session) throws HibernateException, SQLException {
                    Criteria criteria = session.createCriteria(Institution.class);
                    criteria.addOrder(Order.asc("name"));
                    return criteria.list();
                }
            });
        }
    Je dois avouer ne pas vraiment bien saisir pourquoi on doit passer par une telle complexité de code, alors qu'en HQL, HibernateTemplate nous offre la très belle méthode "find". Votre méthode DAO prend une seule ligne, ici il en faut maintenant 9...

    N'y a-t-il rien de plus simple qui permette d'utiliser les Criteria sans prendre de risques?
    Merci pour vos avis!

  2. #2
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Voici un exemple sorti de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public  List<Campaign>  getCampaigns(  Boolean filterValidated, boolean prefetchUser, boolean prefetchItems)
        {
     
            DetachedCriteria criteria = DetachedCriteria.forClass(Campaign.class);
     
            //set filters and fetch modes...
            if( filterValidated != null)
                criteria.add( Restrictions.isNotNull( Campaign.PROP_VALIDATION_DATE ) );
     
            if(prefetchItems )
                criteria.setFetchMode(Campaign.PROP_ITEM, FetchMode.JOIN);
     
            if( prefetchUser )
                criteria.setFetchMode(Campaign.PROP_USER, FetchMode.JOIN);
     
            return getHibernateTemplate().findByCriteria(criteria);
     
        }
    Comme tu peux le voir, je profite de l'API criteria.

    Dans ton premier exemple, Il est en effet contre-indiqué de bosser avec l'API hibernate directement, pour des raisons de sessions et il me semble (sans avoir vérifié, prend le comme tel) d'encapsulation des exceptions hibernate en exception Spring.

    Généralement on utilise la fonctionnalité de callback de hibernateTemplate seulement quand on a vraiment besoin d'une fonctionnalité bas niveau d'hibernate qu'on ne peut obtenir avec les méthodes wrapper de hibernateTemplate.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Par défaut
    Merci, c'est ce que j'avais finalement trouvé aussi!

    Un seul détail : dommage que findByCriteria retourne une List et qu'il n'existe pas un équivalent de unique result, mais c'est un embêtement mineur.

  4. #4
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Si ca tenait qu'à moi, j'aimerai aussi un deleteByCriteria puis plein d'autres options. C'est très commode à lire et à utiliser.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Dans ton premier exemple, Il est en effet contre-indiqué de bosser avec l'API hibernate directement, pour des raisons de sessions
    Pourquoi donc ? Peux tu expliquer ?

    Je ne suis pas pour l'utilisation du callback, tout du moins dans ton cas et pour la raison que tu invoques.
    La fermeture de la session ne doit pas être gérée au niveau du dao.
    En générale on regroupe plusieurs accès à la base, (un service qui appelle plusieurs DAO), sous la même session.

  6. #6
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    En fait j'ai mal lu son code, je n'ai pas vu qu'il employait getSession() fourni par hibernateTemplate et donc qu'il devenait responsable de la gestion de session.

    Mais le reste sur l'encapsulation d'exception reste vrai.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Spring][Hibernate] Transaction déclarative
    Par mauvais_karma dans le forum Hibernate
    Réponses: 13
    Dernier message: 03/07/2008, 17h09
  2. spring hibernate
    Par mehdi_swatch dans le forum Hibernate
    Réponses: 15
    Dernier message: 17/06/2006, 09h26
  3. [SPRING][HIBERNATE][MYSQL] insert et valeur des champs.
    Par nikalkal dans le forum Hibernate
    Réponses: 9
    Dernier message: 27/04/2006, 14h07
  4. Réponses: 2
    Dernier message: 16/02/2006, 09h04
  5. Réponses: 5
    Dernier message: 25/05/2005, 21h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo