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 :

Mapper une association bidirectionnelle reflexive


Sujet :

Hibernate Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2007
    Messages : 68
    Par défaut Mapper une association bidirectionnelle reflexive
    Bonjour,

    Je cherche le mapping hibernate 3.0 pour faire une classe qui a une liste doublement chainée.

    Par exemple, une classe A qui a un objet de la classe A nommé prédécesseur et un objet de la classe A nommé successeur.

    A la manière des associations one-to-many, je pense qu'il faudra déclarer un côté "inverse", mais là je ne vois même pas quelle balise utiliser (one-to-one me semblait convenir mais je ne trouve pas d'inverse!).

  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
    tu peux éventuellement utiliser un one-to-many bidirectionnel avec un unique="true" pour en faire un one-to-one

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2007
    Messages : 68
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    tu peux éventuellement utiliser un one-to-many bidirectionnel avec un unique="true" pour en faire un one-to-one
    Oui mais dans ce cas je ne vois pas comment mettre un reverse sur un one-to-many, j'aimerais qu'un seul attribut de la table A gère cette association bidirectionnelle.

  4. #4
    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
    si il est bidirectionnel, un des sens de la bidirection doit avoir inverse=true, et tu n'aura de toutes facons qu'une foreign-key qui gère l'association.

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2007
    Messages : 68
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    si il est bidirectionnel, un des sens de la bidirection doit avoir inverse=true, et tu n'aura de toutes facons qu'une foreign-key qui gère l'association.
    C'est justement ce que je cherche à obtenir mais ma question est plus orienté "syntaxe" car à ma connaissance seules les balises de collections (set, bag, etc, ...) peuvent spécifier "inverse"

  6. #6
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    <many-to-one name="previous"
                        column="previous_id"
                        unique="true"/>
    <one-to-one name="next" class="mypackage.Node" property-ref="previous"/>
    devrais marcher je pense ^^

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2007
    Messages : 68
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    <many-to-one name="previous"
                        column="previous_id"
                        unique="true"/>
    <one-to-one name="next" class="mypackage.Node" property-ref="previous"/>
    devrais marcher je pense ^^
    Ca semble bien seulement l'implémentation des setters "previous" et "next" ne sont pas triviales. Que penses-tu de ce 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
     
        public void setRevisionPrecedente(RevisionSituation versionPrecedente)
        {
    	this.revisionPrecedente = versionPrecedente;
        }
     
        public void setRevisionSuivante(RevisionSituation revisionSuivante)
        {
    	RevisionSituation old = this.revisionSuivante;
    	if (old != null && old.getRevisionPrecedente().equals(this))
    	{
    	    old.revisionPrecedente = null;
    	}
    	this.revisionSuivante = revisionSuivante;
    	revisionSuivante.revisionPrecedente = this;
        }
    C'est bon, mauvais ou trop compliqué ?

  8. #8
    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
    généralement, dans le cas ou les beans se chargent de gérer leurs relations bidirectionnelles eux même, le préfère avoir ce genre de 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
     
    setPrevious(Node n){
       if (n.getNextImpl()==this)
         return;
       if (previous.getNextImpl()==this)
           previous.setNextImpl(null);
       if (n.getNext()!=null)
         n.setNext(null);
       n.setNextImpl(this)
       setPreviousImpl(n);
    }
    protected setPreviousImpl(Node n){
       this.previous=n;
    }
    code similaire pour next, et hibernate mapper les nextImp;, previousImpl.

    Sinon ton problème est que ton code sera appelé par hibernate au chargement des objets!

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2007
    Messages : 68
    Par défaut
    D'accord, merci pour ton aide précieuse

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

Discussions similaires

  1. Récupération des objets d'une association bidirectionnelle
    Par mbenameur dans le forum Doctrine2
    Réponses: 5
    Dernier message: 28/12/2012, 16h49
  2. [Hibernate2] [Hibernate] Mapper une association
    Par seanbean dans le forum Hibernate
    Réponses: 6
    Dernier message: 18/11/2012, 22h03
  3. [Hibernate] Mapper une association (MCD)
    Par seanbean dans le forum Persistance des données
    Réponses: 0
    Dernier message: 12/04/2012, 13h41
  4. Mapper une association porteuse d'information
    Par cereal dans le forum Hibernate
    Réponses: 1
    Dernier message: 11/08/2009, 13h03
  5. Réponses: 7
    Dernier message: 25/08/2008, 16h13

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