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] Queries et relation NN


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Points : 53
    Points
    53
    Par défaut [Hibernate] Queries et relation NN
    Salut !

    J'ai 3 tables dans une base de donnée :

    User, Device, user_device.

    Il existe une relation NN : un user peut posseder plusieurs devices et un device peut etre possedé par plusieurs users.

    Considerant la query suivante :

    SELECT * FROM Device, user_device WHERE Device.id = DeviceId AND UserId = 1;

    pour recuperer les devices possedees par le user ayant l'id 1 comment puis-je faire pour obtenir la meme chose dans Hibernate ?
    Comment ferais-je ma query HQL ?
    Enfin Comment dois-je coder mon POJO et les fichiers de config du pojo ?

    Merci

  2. #2
    Membre habitué
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Points : 194
    Points
    194
    Par défaut Re: [Hibernate] Queries et relation NN
    Salut
    Citation Envoyé par azpublic
    Salut !

    J'ai 3 tables dans une base de donnée :

    User, Device, user_device.

    Il existe une relation NN : un user peut posseder plusieurs devices et un device peut etre possedé par plusieurs users.

    Considerant la query suivante :

    SELECT * FROM Device, user_device WHERE Device.id = DeviceId AND UserId = 1;
    pour recuperer les devices possedees par le user ayant l'id 1 comment puis-je faire pour obtenir la meme chose dans Hibernate ?
    Comment ferais-je ma query HQL ?
    En fait, ca dépend des classes. En supposant que ta classe User a une collection "devices", ca pourrait être quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select u.devices from User as u where u.userId = '1';


    Citation Envoyé par azpublic
    Enfin Comment dois-je coder mon POJO et les fichiers de config du pojo ?
    Merci
    Cela dépend de ton utilisation des classes : est ce que les users savent les devices qu'ils possèdent? est ce que les devices savent par quels users ils sont possédés? Relation unilatérale ou bilatérale.

    Je te conseille te lire la doc d'hibernate et de ne pas hésiter si tu as des questions précises.

    sylvain_2020

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    Ok merci a toi pour ces précisions.

    En lisant la doc j'ai compris les relations unilatérales et bilatérales.
    Du coup j'ai modifié ma classe user pour qu'elle integre une collection devices et j'ai modifié le mapping correspondant et ca a l'air de marcher.

    Par contre je ne sais pas comment utiliser la collection de devices que je récupère

    Dans la servlet qui travaille avec l'objet POJOUser je fais la chose suivante :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
                    //hibernate session and transaction
    		Session hibSession;
    		Transaction tx;
     
    		//Creation de notre objet Session grace à notre HibernateUtil  
    		hibSession = HibernateUtil.currentSession();
    		//Ouverture de notre transaction avec Hibernate grace
    		// a la session 
          	        tx = hibSession.beginTransaction();
     
          	Query query = hibSession.createQuery("from POJOUser u where u.login ='monlogin'");
     
     
          	String firstName = new String();
          	Set devices = new HashSet();
     
     
    	for (Iterator it = query.iterate(); it.hasNext();) {
        		POJOUser user = (POJOUser) it.next();
        		firstName = user.getFirstName(); 
     
                   //recupération des devices pour ce user
                   devices = user.getDevices();
     
    	}
    J'imagine que dans ma collection devices j'ai récuperé des tuples de la table devices qui sont liés a mon user 'monlogin'.

    Maintenant comment faire pour travailler avec ?
    J'aimerai isoler chaque tuple et chaque attribut d'un tuple (colonne) pour pouvoir ensuite les balancer dans un bean de session.
    Pour reformuler :
    Si j'ai une colonne DeviceName dans ma table device est-ce que je peux faire un truc du style devices.getDeviceName(); pour obtenir le nom devicename ?
    Je ne vois pas vraiment comment faire ...

    Merci pour ton aide

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Points : 194
    Points
    194
    Par défaut
    Citation Envoyé par azpublic
    Si j'ai une colonne DeviceName dans ma table device est-ce que je peux faire un truc du style devices.getDeviceName(); pour obtenir le nom devicename ?
    Bien sur que tu peux le faire ... d'ailleurs je ne pense pas que ce soit très difficle de le tester par toi-même .

    Il faut juste faire attention dans le cas où tu as une entité persistée A qui pointe vers une autre entité persistée B. Pour que lorsque tu recupères A, tu puisses directement récupérer B, il faut que soit la relation entre A et B soit mappée avec l'attribut lazy="true", soit il faut que tu fasses explicitement un a.getB() à l'intérieur d'une session.
    Ce n'est peut-être pas très clair ce que je te dis, mais encore une fois, tout est très bien expliqué dans la doc.

    sylvain_2020

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    Resalut et merci de ta patience ... je suis une plaie ...


    Bon alors voila ce que j'ai essayé ... et qui ne marche pas ...


    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
     
    HttpSession session = request.getSession();
     
    		//hibernate session
    		Session hibSession;
    		Transaction tx;
     
    		//Creation de notre objet Session grace à notre HibernateUtil  
    		hibSession = HibernateUtil.currentSession();
    		//Ouverture de notre transaction avec Hibernate grace
    		// a la session 
          	tx = hibSession.beginTransaction();
     
          	Query query = hibSession.createQuery("from POJOUser u where u.login ='monlogin'");
     
     
          	String firstName = new String();
          	//Set devices = new HashSet();
          	String deviceName = new String();
     
    	for (Iterator it = query.iterate(); it.hasNext();) {
        		POJOUser user = (POJOUser) it.next();
        		firstName = user.getFirstName(); 
     
        		POJODevice devices = (POJODevice) user.getDevices(); [b]//C'est ici que ca plante [/b]
        		deviceName = devices.getName();	
     
    	}

    Ca plante au niveau de POJODevice devices = (POJODevice) user.getDevices();

    et j'obtiens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    java.lang.ClassCastException: org.hibernate.collection.PersistentSet
    	at com.xxx.tracer.UserSessionInit.initUser(UserSessionInit.java:43)
    lorsque je lance la servlet ...

    J'ai bien mis lazy="true" dans le maping de mon POJOUser comme suit :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    <!-- define a set for many to many relations-->
          <set name="devices" 
          		 table="user_device"
          		 lazy="true"
          		>
            <key column="user_id"/>
            <many-to-many column="device_id" class="com.xxx.tracer.POJODevice"/>
        	</set>
    Je t'avoue que je suis completement perdu et la doc ne m'est pas d'une grande aide car je n'ai pas trouvé d'exemple concret m'expliquant comment faire ce que je veux ...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Points : 53
    Points
    53
    Par défaut

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Points : 194
    Points
    194
    Par défaut
    Salut,

    Ce ne serait pas tout simplement un problème de cast ?

    Citation Envoyé par azpublic
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    POJODevice devices = (POJODevice) user.getDevices(); [b]//C'est ici que ca plante [/b]
    J'imagine que user.getDevices() te renvoie un Set, non ?

    sylvain_2020

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    Salut a toi Sylvain !

    Je pense en effet qu'il sagit d'un probleme de cast.
    Par contre si je déclare "devices" en tant que Set :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set devices =  user.getDevices();
    comment vais-je récuperer les propriétés de devices ( par exemple si je veux récuperer Devicename) ?

    Sinon je suis entrain de lire un bon livre sur le sujet (en ce moment même d'ailleurs) et je le recommande a tous les débutants sur le sujet de l'ORM avec Hibernate :

    Manning: Hibernate Quickly (2005)

    Ce livre est d'ailleurs le petit frère de Hibernate in Action du même éditeur qui est aussi très bien fait meis peut etre un peu plus technique pour débuter.

    Merci pour ton aide ^^

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Points : 194
    Points
    194
    Par défaut
    Citation Envoyé par azpublic
    Je pense en effet qu'il sagit d'un probleme de cast.
    Par contre si je déclare "devices" en tant que Set :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set devices =  user.getDevices();
    comment vais-je récuperer les propriétés de devices ( par exemple si je veux récuperer Devicename) ?
    La, c'est du java pur ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		Set devices = user.getDevices();
    		Iterator iter = devices.iterator();
    		while(iter.hasNext()){
    			Device device = (Device) iter.next();
    			device.getDeviceName();
    		}
    sylvain_2020

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 75
    Points : 53
    Points
    53
    Par défaut
    Ok.

    Donc si je comprend bien je récupere une collection d'objets POJODevice dans mon Set devices et je peux acceder a toutes les propriétés et methodes de POJODevice par objet.

    THANK YOU VERY MUCH !

    P.S. Je ne suis pas encore tres au point sur les collections en Java donc c'est probablement pour ca que j'ai un peu de mal a comprendre par fois ^^ ... mais je me soigne.


    MERCI ENCORE !!!

  11. #11
    Membre habitué
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Points : 194
    Points
    194
    Par défaut
    Citation Envoyé par azpublic
    Je ne suis pas encore tres au point sur les collections en Java donc c'est probablement pour ca que j'ai un peu de mal a comprendre par fois ^^ ... mais je me soigne.
    Pas de soucis, pense à mettre le tag résolu ...

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

Discussions similaires

  1. hibernate query language
    Par marwen2300 dans le forum Hibernate
    Réponses: 1
    Dernier message: 24/04/2007, 09h03
  2. Réponses: 3
    Dernier message: 08/06/2006, 17h38
  3. Hibernate : suppression sur relation many to one
    Par taf dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/05/2006, 13h08
  4. Hibernate et les relations pere/enfant
    Par kurkLord dans le forum Hibernate
    Réponses: 6
    Dernier message: 19/01/2005, 04h37

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