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: valeur issu d'une autre table


Sujet :

Hibernate Java

  1. #1
    Membre du Club Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Points : 55
    Points
    55
    Par défaut mapping: valeur issu d'une autre table
    Bonjour à toutes et à tous,

    Je dois rajouter à un objet mappé dans Hibernate un attribut qui lui est issu d'une autre table que la table mappée par l'objet.

    Mon objet est de type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class Personne {
     
       public int id;
       public String dateDeNaissance;
       public String nom;
       public String prenom;
       public String numeroDeCompte;
     
       public Personne() { /* */ }
     
       // getter et setter
    }
    Mes tables sont:
    T_PERSONNE:
    - ID_PERSONNE
    - NOM_PERSONNE
    - PRENOM_PERSONNE
    - DATE_NAISSANCE

    et

    T_BANQUE:
    - NUMERO_COMPTE
    - ID_PERSONNE
    - SOLDE

    mon mapping est de type
    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
     
    <hibernate-mapping>
        <class name="com.machin.core.Personne" 
        		table="T_Personne"
        		proxy="com.machin.core.Personne"
        		mutable="false"
        		dynamic-update="false" 
        		dynamic-insert="false">
        	<cache usage="read-only"/>
            <id name="id" column="ID_PERSONNE">
            	<generator class="assigned"/>
            </id>
     
            <property name="nom" column="NOM_PERSONNE"/>
            <property name="prenom" column="PRENOM_PERSONNE"/>
            <property name="dateDeNaissance" column="DATE_NAISSANCE"/>
     
            <set name="numeroDeCompte" table="T_BANQUE">
                <key column="ID_PERSONNE"/>
                <property name="numeroDeCompte" column="NUMERO_COMPTE" where="SOLDE IS NOT NULL"/>
            </set>
       </class>
    En fait je dois rajouter au mapping la valeur de numeroDeCompte
    correspondant à:
    SELECT NUMERO_DE_COMPTE FROM T_BANQUE WHERE SOLDE IS NOT NULL AND ID_PERSONNE = ....

    évidemment en partant du principe qu'il n'y a qu'une valeur envoyée par la requête

    (pour des raison de confidentialités, j'ai changé les valeurs, nom et idée des tables réellement utilisées... j'ai pris comme exemple le secteur banquaire, mais j'aurais pu aussi prendre le secteur automobile, assurance, télécom, etc...)

    Si quelqu'un a une idée de comment faire ce type de mapping sous hibernate, je lui en saurai gré et reconnaissant. Car je n'ai pas trouvé dans les docs disponibles sur la toile comment faire ce genre de chose...

    Merci d'avance

    Amicalement
    Gojira

    [edit]correction de l'objet exemple java[/edit]

  2. #2
    Membre du Club Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    apparemment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <set name="numeroDeCompte" table="T_BANQUE">
                <key column="ID_PERSONNE"/>
                <property name="numeroDeCompte" column="NUMERO_COMPTE" where="SOLDE IS NOT NULL"/>
            </set>
    est faux car "set" défini un ensemble est ne peut être utilisé qu'avec des mot clef comme many-to-one, composite-element

    donc il faudrait quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <property name="drugBankId" table="MOLDRUG" column="ID_DRUG" where="SOLDE IS NOT NULL">
            <key column="id_mol"/>
    </property>
    ce qui est faux aussi

    je viens de voir ici : http://www.dil.univ-mrs.fr/~massat/d...l/mapping.html

    qu'il est possible de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="nomProp" column="NOM_COLUMN" formula="SELECT .... "/>
    est-ce que je peux utiliser cela? Si oui, comment faire pour que la requête utilise l'ID définit par la table?

  3. #3
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    alors, vu ton mapping, c'est effectivement un many-to-one. Le problème c'est que la table contiens aussi d'autres données (solde) et donc la question se posera: "comment va-tu updater le solde avec ce genre de mapping sans tout casser?"

    Je recommanderais plutot de faire le mapping suivant

    Une classe Personne: nom, prénon, date de naissance et 0..n comptes
    Une classe Compte: numéro de compte (id hibernate ), solde, propriétaire.

    Après, si tu as besoin dans ton cas d'une propriété particulière dans personne, tu peux la coder:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Personne {
        /** Retourner l'unique compte d'une personne ou le premier compte non vide
         * si plusieurs comptes.
         */
        public String getCompteUnique(){
           for (Compte c: getComptes())
             if (c.getSolde()<>0)
               return c;
           return null;
        }
    }
    Le fait d'avoir une base de données derrière ne t'oblige pas à tout faire avec des requetes

  4. #4
    Membre du Club Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Bonjour,

    Merci beaucoup pour la réponse.
    en fait, il n'y a pas de modification des classes java possible...
    C'est au mapping de s'adapter...

    Donc il faut que je crée une classe de Mapping pour la table T_BANQUE, et que je rajoute un champ many-to-one pour le mapping de personne?

    Merci beaucoup pour ton aide, ça me permet de mieux voir les contraintes de Hibernate et ses limitations.

  5. #5
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    tu peux le faire avec le formula par exemple, mais ce sera une propriété en lecture seule et ne seront pas mise à jour automatiquement si tu change un compte. Si les classe ne peuvent pas changer, change la DB alors, mais tu ne peux pas prendre de classes d'une coté, des tables de l'autre, qui ne sont pas en correspondance d'un point de vue design et dire "c'est au mapping à s'adapter", il aura des limites. On peux faire beaucoup avec des outils comme hibernate, mais il faut quand meme en respecter les principes et les limites.

    De plus, avec ton schéma de table, si je prend une personne, et que je change son numéro de compte, comment le mapping est supposé (d'après toi) gérer la table compte? Rajouter une ligne? Supprime le compte précédent? Et que faire du solde que tu ne sais, manifestement, pas mettre à jour?

  6. #6
    Membre du Club Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Merci beaucoup pour l'explication. C'est très clair.
    Comme je suis en lecture seule et en select uniquement, je peux me permettre ce contournement. Vu que le contenu de la base n'est pas censé évoluer dynamiquement, et si évolution il y a, l'application est réinitialisée entièrement (car elle aura évoluée elle aussi).

    Merci pour tout...

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

Discussions similaires

  1. Impossible d'afficher une valeur existe dans une autre table
    Par mcharmat dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 06/02/2013, 06h38
  2. Réponses: 3
    Dernier message: 13/02/2009, 11h02
  3. "insert into" de valeurs provenant d'une autre table
    Par jgfa9 dans le forum Requêtes
    Réponses: 5
    Dernier message: 31/01/2008, 09h44
  4. Réponses: 7
    Dernier message: 17/10/2006, 16h32
  5. [Debutant] Appel d'enregistrement issu d'une autre table
    Par grasduslip dans le forum Access
    Réponses: 15
    Dernier message: 21/07/2006, 16h34

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