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 :

Mapping bidirectionelle et cascade, aide appréciée!


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Mapping bidirectionelle et cascade, aide appréciée!
    Bonjour,

    J'ai un problème simple que je n'arrive pas à résoudre d'une façon satisfaisante.

    Prenons une classe Parent (idParent, nom, prenom, set<Enfants>)
    Puis une classe Enfant ( idEnfant, nom, age, Parent ).

    Un parent ayant un set d'enfant, un enfant ayant un parent.

    J'aimerais pouvoir créer un parent, lui ajouter des enfants et sauver tous ce graphe par un appel de saveOrUpdate sur le parent. Voici le mapping de la collection coté parent :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <set name="enfants" lazy="true"  cascade="all" inverse="true" >
                <key column="id_parent"/>
                <one-to-many  class="advertisementapp.hibernate.entities.Enfant"  />
        </set>
    Puis coté enfant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <many-to-one name="parent" class="advertisementapp.hibernate.entities.Parent" column="id_parent" not-null="true" fetch="select" />
    Voilà, si je me contente de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Parent par = new Parent()..
    par.GetEnfants.Add( new Enfant("toto", 14) );
     
    session.saveOrUpdate( par );
    Je me ramasse une exception de valeur nulle interdite. Cela arrive semble-t-il parce que la propriété "parent" de Enfant est à null.

    Je me demande si il y a pas une solution pour que je n'ai pas besoin de setter la relation des deux cotés du graphe, c'est à dire ajouter l'enfant au Set du parent *ET* définir dans enfant la propriété parent?
    En gros que hibernate se charge de Setter cette propriété Parent à ma place.

    Est-ce possible? Car sinon je vois aucune solution pour garantir qu'un enfant ajouté au Set d'un parent ait bel et bien *ce même parent* dans ses propriétés.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Hibernate gère la partie mapping sur la base de donnée. Il va remplir tes bean quand tu les charge de la base de donnée, mais certainement pas quand tu les y sauve!
    Ton problème est effectivement que tu n'as défini dans tes bean qu'un seul sens de la relation.


    T'as plusieurs possibilités:
    La plus simple dans un premier temps:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Parent par = new Parent();
    Enfant e = new Enfant("toto", 14);
    par.GetEnfants.Add( e );
    e.setParent(par);
    la deuxième (plus propre):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Parent {
       public void addEnfant(Enfant e){
           if ( (e.getParent()!=null)  && (e.getParent()!=this)){
             e.getParent().getEnfants().remove(e); // detacher du précédent parent      
           }
           e.setParent(this);
           this.getEnfants().add(e);
       }
    }
     
    ....
    Parent par = new Parent();
    par.addEnfant(new Enfant("toto", 14));
    Tu peux même forcer le passage par la méthode addEnfants() en ayant une propriété 'enfants' publique qui est non modifiable et une propriété 'enfantsImpl' protégée qui n'est accessible que par hiberante et par addEnfants() et qui elle est modifiable:

    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
     
    public class Parent {
     
       private Set enfantsImpl;
       protected Set getEnfantsImpl(){return enfantsImpl;}
       protected void setEnfantsImple(Set s){enfantsImpl = s;}
       public Set getEnfants() {return Collections.unmodifiableSet(getEnfantsImpl()); }
     
       public void addEnfant(Enfant e){
           if ( (e.getParent()!=null)  && (e.getParent()!=this)){
             e.getParent().getEnfantsImpl().remove(e); // detacher du précédent parent      
           }
           e.setParent(this);
           this.getEnfantsImpl().add(e);
       }
    }

  3. #3
    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
    Merci beaucoup c'est ce que je voulais savoir.

Discussions similaires

  1. [XL-2003] Fichier Ecrasé : aide appréciée !
    Par Neo70 dans le forum Excel
    Réponses: 2
    Dernier message: 05/03/2012, 21h38
  2. [JSTL] Récupérer une valeur dans ma map à l'aide d'une clé
    Par Sim dans le forum Taglibs
    Réponses: 1
    Dernier message: 29/08/2006, 10h03
  3. aide : recherche algorithme mapping
    Par nagty dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 30/12/2005, 14h19
  4. Besoin d'aide pour maps
    Par Malachai dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 17/10/2005, 09h10

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