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

Hibernate Java Discussion :

[hibernate] Eclaircissements sur la philosophie d'Hibernate [FAQ]


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 36
    Par défaut [hibernate] Eclaircissements sur la philosophie d'Hibernate
    Bonjour,

    J'essaye de comprendre comment marche Hibernate. Si je comprends bien, Hibernate me permet de mapper des objets Java et des lignes d'une table d'une base de donnée.

    Par contre il est aussi dit que les objets sont persistants. Cela veut-il dire qu'une fois instancié mon objet reste dans la mémoire de la JVM ?

    Si oui, comment cela se passe-t-il dans un environnement servlet sous Tomcat. Est-ce que si deux utilisateurs instancient un objet correspondant à la même ligne de la table, un seul objet sera instancié ?

    Est-ce que celui-ci va rester en mémoire une fois que la servlet, ou le JSP, a fini son travail ?

    Merci pour votre aide.

    Cordialement.

    PS : je me tourne vers vous, car du côté du forum du site d'hibernate, a priori je n'ai pas reçu de réponse

  2. #2
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Je vais passer un peu les détails :

    - tu crées ton objet (Commande cde = new Commande())
    - tu fixes les propriétés (cde.setDateCommande(...))
    - tu récuperes une session Hibernate
    - tu fais persister ton objet (session.save(cde)), ton objet devient alors persitant tant qu'il est associé à TA session et dans une transaction.
    - si tu modifies les valeurs des propriétés de ta classe, elles seront persistées automatiquement
    - tu fermes ta session, ton objet n'est plus persistant (mais continue d'exister en base)

    Il faut noter que ta session hibernate n'est pas partagée entre tes utilisateurs et tes objets sont associées à une seule session. Il faut voir ta session comme un cache local à ton thread.

  3. #3
    Membre confirmé
    Homme Profil pro
    Responsable outils métier VIGS (Veolia)
    Inscrit en
    Septembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Responsable outils métier VIGS (Veolia)
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 80
    Par défaut
    Bonjour,

    Persistant signifie que l'objet sera stocké en base de données.
    Au lieu d'écrire toutes les requêtes SQL nécessaires à inscrire les propriétés/données de l'objet en base de données afin de pouvoir recharger les propriétés/données de l'objet lors d'un prochain démarrage de l'application (Création d'un objet, modification de l'objet, suppression de l'objet équivalent à insert into, update et delete en SQL), hibernate permet de mapper les objets avec les tables correspondantes et génère automatiquement les requêtes SQL correspondantes à l'action désirée (insert into, update ou delete ...).

    Hibernate dispose en plus d'un cache de données et d'un language de requête orienté objet, et encore beaucoup d'autres fonctionnalités


    Plus d'infos :

    http://www.hibernate.org/hib_docs/reference/fr/html/
    ==> Version Française de la doc, ce n'est cependant pas la dernière version !!!!

  4. #4
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 36
    Par défaut
    Citation Envoyé par dlemoing
    Il faut noter que ta session hibernate n'est pas partagée entre tes utilisateurs et tes objets sont associées à une seule session. Il faut voir ta session comme un cache local à ton thread.
    Hum. Dans un environnement servlet (par Tomcat), la session Hibernate a un rapport avec la session Tomcat ? Je serais tenté de répondre non, mais j'ai peut-être tort . Est-ce pour cela que tu dis que la session hibernate n'est pas partagé entre utilisateurs ?

  5. #5
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Exactement, il n'y a pas de lien entre session hibernate et session au niveau de ton serveur d'application.
    Tu dois plutot voir la session hibernate comme un cache lié au thread de traitement de ta requete http.
    Dans certains cas, tu peux être amené à réutiliser ta session entre plusieurs requetes http (business transaction) et donc ta session est plus étroitement liée à ta session web, mais je te déconseille cette voie dans un premier temps, utilise et découvre Hibernate avant.

  6. #6
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 36
    Par défaut
    Citation Envoyé par dlemoing
    Exactement, il n'y a pas de lien entre session hibernate et session au niveau de ton serveur d'application.
    Hum, si je dois instancier une session hibernate à chaque servlet, et recréer mes objets également, cela risque d'être un peu long au niveau du traitement non ? Je comprends bien qu'hibernate m'apporterais de la souplesse au niveau de la maintenance et de l'écriture de mon code, mais j'ai peur d'apporter une lourdeur au traitement sous Tomcat ...

    Ai-je tort ?

  7. #7
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Si tu devais recréer une SessionFactory à chaque fois, oui ce serait très lourd.
    Créer une session est très rapide.
    Pourquoi parles tu de "recréer" tes objets ? Si tu utilises hibernate pour faire ta recherche tu n'as aucun problème de reconstruction de ton arbre d'objets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Commande cde = session.load(...);
    Long l = cde.getIdCommande();
    List lignesCde = cde.getLignesCde();
    Iteraotr it = lignesCde.iterator();
    while (it.hasNext()) {
        LigneCommande lcde = (LigneCommande)it.next();
        Produit p = lcde.getProduit();
        int qte = lcde.getQuantite();
    }
    Le nombre de requetes dépendra du mapping.

  8. #8
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 36
    Par défaut
    Citation Envoyé par dlemoing
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Commande cde = session.load(...);
    Long l = cde.getIdCommande();
    List lignesCde = cde.getLignesCde();
    Iteraotr it = lignesCde.iterator();
    while (it.hasNext()) {
        LigneCommande lcde = (LigneCommande)it.next();
        Produit p = lcde.getProduit();
        int qte = lcde.getQuantite();
    }
    Le nombre de requetes dépendra du mapping.
    Ah, tu donnes un exemple. Et bien justement sur ce genre d'exemple, je pourrais très facilement créer une requête SQL me retournant mes quantités de produits et une simple boucle sur le ResultSet correspondant me donnerait les mêmes résultats.

    Par contre, a priori, l'exécution à travers la requête spécifique est sûrement plus rapide, que l'instanciation de tous les objets créés dans ton while, non ?

    Ceci me fait penser qu'hibernate n'est peut-être pas à utiliser tout le temps et qu'il faut bien voir dans quel contexte on veut l'utiliser ... mais là encore je me trompe peut-être ....

  9. #9
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Cherche un peu dans le forum, j'ai déjà répondu à ce genre de questions.
    Rien ne t'empeche avec Hibernate d'écrire une requete qui contienne un count.
    http://www.hibernate.org/hib_docs/reference/fr/html_single/#manipulatingdata-scalarqueries
    http://www.hibernate.org/hib_docs/reference/fr/html_single/#queryhql-aggregation

    Maintenant, si tu veux utiliser Hibernate pour du reporting, ce n'est certainement pas le meilleur outil.

    Citation Envoyé par Didier69
    Ah, tu donnes un exemple. Et bien justement sur ce genre d'exemple, je pourrais très facilement créer une requête SQL me retournant mes quantités de produits et une simple boucle sur le ResultSet correspondant me donnerait les mêmes résultats.
    Si tu préfères travailler sur un ResultSet plutot que sur des objets métiers c'est ton choix mais c'est un choix douteux si ton modèle peut bénéficier de l'ORM.

    Citation Envoyé par Didier69
    Par contre, a priori, l'exécution à travers la requête spécifique est sûrement plus rapide, que l'instanciation de tous les objets créés dans ton while, non ?
    Ca dépend de la requete, ca dépend de ce que tu veux faire. Veux tu un domain model riche ? Veux tu faire du reporting ? Quel est ta maitrise des concepts de l'ORM ? Programmer objet a t'il un sens pour toi ?

    Citation Envoyé par Didier69
    Ceci me fait penser qu'hibernate n'est peut-être pas à utiliser tout le temps et qu'il faut bien voir dans quel contexte on veut l'utiliser ... mais là encore je me trompe peut-être ....
    Je suis d'accord. Mais si tu ne dis pas ce que tu souhaites, on ne peut pas t'aider bcp plus.

  10. #10
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 36
    Par défaut
    Merci dlemoing pour tes éclaircissements. Loin de moi l'idée de t'embêter, mais c'est vrai que ce n'est pas facile de comprendre les implications que pourraient avoir cette technologie sur le développement ou sur l'exécution de l'application. D'où mes questions .

    Il est vrai que je n'ai pas encore mis en place cette technologie, et que je n'ai fait que lire la documentation et chercher des exemples sur le net. J'essaye de me faire une idée sur la manière dont les développeurs l'utilisent ...

    Merci encore d'avoir pris le temps de me répondre .

    Amicalement.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 35
    Par défaut
    Voici un exemple minimaliste de ce que je fais (dans l'idée d'apprendre à me servir d'hibernate) - C'est struts + hibernate + freemarker :

    Ceci dans une Action struts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
           log.debug("listMessages called");
            MessageDAO messageDAO = new MessageDAO();
            request.setAttribute("messages", messageDAO.findAll(0));        
            return (mapping.findForward("success"));
    Dans le template FreeMarker ça donne ceci (ça serait très proche avec des jsp) - j'ai laissé ce qui est significatif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <#list messages as message>
    	<b>${message.title}</b> - ${message.datecreated}
    	<br/>${message.content}<br/>
           <hr class="applist_sep"> <#-- Séparateur -->
    </#list>

    Et enfin, messageDAO.findAll(0)) ça donne ça (cette méthode retourne une List contenant les objets correspondant aux enregistrements de la table Message) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public Collection findAll(int limit) throws HibernateException
        {
            Query query = hsession.createQuery("FROM Message as msg ORDER BY msg.datecreated DESC");        
            if(limit > 0)
                query.setMaxResults(limit);
            return query.list();
        }

Discussions similaires

  1. [Hibernate] Questions sur les fonctionnalités d'Hibernate
    Par KneXtasY dans le forum Hibernate
    Réponses: 1
    Dernier message: 31/05/2007, 17h41
  2. Hibernate : suppression sur relation many to one
    Par taf dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/05/2006, 13h08
  3. [Hibernate] delete sur un many-to-many
    Par Gob4 dans le forum Hibernate
    Réponses: 1
    Dernier message: 10/05/2006, 16h26
  4. [PLUG IN HIBERNATE] introuvable sur le net
    Par PamelaGeek dans le forum Eclipse Java
    Réponses: 11
    Dernier message: 02/01/2006, 18h35
  5. [Hibernate]Question sur Hibernate
    Par elhani dans le forum Hibernate
    Réponses: 2
    Dernier message: 30/12/2005, 15h39

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