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 :

Définir une relation 1-1


Sujet :

Hibernate Java

  1. #1
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Points : 134
    Points
    134
    Par défaut Définir une relation 1-1
    Bonjour,

    J'utilise une base de données Oracle 11g et Hibernate 4.0

    J'ai trouvé beaucoup de tutoriels permettant de mettre en place une relation one to one, mais après quelques essais, rien n'est concluant, je dois avoir zappé quelque chose.

    Mise en situation :
    J'ai 2 tables :
    - USERS (USR_ID , USR_NAME, USR_PSW, INF_ID)
    - INFOS (INF_ID, LAST_NAME, FIRST_NAME, PHONE_NUM)

    La clé primaire de USERS est : USR_ID
    La clé pimaire de INFOS est : INF_ID
    La clé étangère de USERS est : INF_ID

    J'ai mes 2 fichiers de mapping et chaque classe fonctionne individuellement.

    Les classes identités associées :
    - User (id, username, password, infId) --> et je voudrais infos en plus
    - InfoUser(indId, firstName, lastName, phoneNumber)

    Un exemple de commande que je voudrais pouvoir réaliser :

    System.out.println(DBMethods.getUser(1).getInfos().getFirstName());
    --> Mais cela me renvoie une nullPointerException.

    J'ai essayé l'utilisation d'annotation @OneToOne ou de modification du fichier de mapping en ajoutant <one-to-one>, sous Oracle les clés sont également bien définie de cette manière, mais ça ne donne rien de concluant.

    Si vous avez une orientation à me donner?

    Merci, à bientôt.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Si tu utilises les fichiers xml, tu dois avoir d'un côté un many-to-one, avec unique=true, et de l'autre côté de la relation, un one-to-one. (si tu veux du bi-directionnel)
    Regarde la doc hibernate, il y a un exemple qui correspond à ton besoin.

  3. #3
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Points : 134
    Points
    134
    Par défaut
    Merci.

    Voici ce que dit la doc :

    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
    @Entity
    public class Body {
        @Id
        public Long getId() { return id; }
     
        @OneToOne(cascade = CascadeType.ALL)
        @MapsId
        public Heart getHeart() {
            return heart;
        }
        ...
    }   
     
    @Entity
    public class Heart {
        @Id
        public Long getId() { ...}
    }
    La doc ici : http://docs.jboss.org/hibernate/core...g.html#d0e7741

    On ne parle pas d'un côté Many-to-one et d'un one-to-one... J'ai suivi la doc, mais le résultat pointe toujours vers une solution nulle, pourtant dans ma base de données, j'ai :

    USERS :
    - USR_ID : 1
    - USR_NAME : usr01
    - USR_PSW : toto01
    - INF_ID : 1

    INFOS :
    - INF_ID : 1
    - FIRS_NAME : jean
    - LAST_NAME : marcel
    - PHONE_NUM : 065/01.01.01

    En faisant en getInfo() sur l'utilisateur ayant l'id = 1, je devrais pouvoir accéder aux attributs des informations qui lui sont propres...

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141

  5. #5
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Points : 134
    Points
    134
    Par défaut
    Merci, ça avance!

    J'arrive à afficher les données des 2 tables, mais indépendemment l'une de l'autre sans qu'il n'y ait d'erreur dans le mapping.

    Mais concernant la relation, je n'ai plus une nullPointerException, mais cette erreur :

    Lors de l'appel de cette méthode :

    System.out.println(DBMethods.getUser(1).getInfos().getFirstName());


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    	at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:149)
    	at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:195)
    	at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
    	at com.dbHib.user.InfosUser_$$_javassist_1.getFirstName(InfosUser_$$_javassist_1.java)
    	at com.dbHib.App.main(App.java:18)

    Edit : problème résolu, la session était fermée avant l'opération. Je pensais qu'en créant un User, les infos seraient automatiquement liée, mais elle le sont uniquement via hibernate. Les méthodes doivent donc obligatoirement être appellée lors d'une session ouverte.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/07/2012, 10h25
  2. Réponses: 4
    Dernier message: 28/06/2012, 11h00
  3. Définir une relation sans requête supplémentaire ?
    Par Bakura dans le forum Doctrine2
    Réponses: 10
    Dernier message: 12/10/2011, 12h09
  4. Comment définir une relation d'équivalence ?
    Par Amon-Râ dans le forum Prolog
    Réponses: 10
    Dernier message: 19/09/2006, 00h27
  5. Définir une appli JEE avec JB7 Entreprise
    Par polo54 dans le forum JBuilder
    Réponses: 4
    Dernier message: 10/06/2003, 11h48

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