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 :

Gestion des clés étrangères


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2011
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 97
    Par défaut Gestion des clés étrangères
    Bonjour à tous,
    Je suis nouveau dans l'univers de Struts2 et Hibernate, et j'ai une application Web à réaliser avec ce framework.
    J'ai commencé a bien apprivoiser la bête, mais je rencontre un soucis pour la gestion de mes formulaires.

    J'ai une table "Client" et une table "Coordonnnees". Ma table Client contient un champ coordonnees_id, pointant vers la clé "id" de ma table Coordonnees.
    J'ai actuellement un formulaire pour créer un nouveau client, avec également les champs relatifs aux coordonnées. J'aimerais qu'en validant ce formulaire, mes 2 tables soient remplies et que mon champ "coordonnees_id" de ma table Client contienne le nouvel id de ma table "coordonnees" (que je viens juste d'insérer).
    J'ai cru comprendre qu'Hibernate pouvait gérer ceci par un "mapping" des classes/tables pour qu'a chaque insert/update/delete, l'action se répercute sur les 2 classes/tables de manière automatique, mais j'avoue ne pas trop m'y connaitre, et j'ai grand besoin d'aide s'il vous plait.

    Fichier add.jsp (formulaire d'ajout d'un client, et de ses coordonnees)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <s:form method="post" action="create">
        <s:textfield cssClass="" label="Nom" name="client.nom" />
        <s:textfield cssClass="" label="Prénom" name="client.prenom" />
        ....
        <s:textfield cssClass="" label="Email" name="coordonnees.email" />
        <s:textfield cssClass="" label="Adresse" name="coordonnees.adresse" />
        <s:submit value="Insert" />
    </s:form>
    Fichier Client.hbm.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <many-to-one class="model.Coordonnees" fetch="select" name="coordonnees">
        <column name="coordoonnees_id"/>
    </many-to-one>
    Fichier Coordonnees.hbm.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <set inverse="true" name="clients">
          <key>
            <column name="coordoonnees_id"/>
          </key>
          <one-to-many class="fr.model.Client"/>
    </set>
    Merci à tous

  2. #2
    Membre chevronné Avatar de Drakiss
    Homme Profil pro
    Consultant MOE
    Inscrit en
    Octobre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2010
    Messages : 185
    Par défaut Comment bien mapper.
    Je viens de trouver un très bon exemple ici d'intégration d'Hibernate avec Struts.

    Le principe est récupérer l'objet SessionFactory dans l'Action (ou sa méthode, vu que tu es en Struts2), de faire un BeanUtils.copyProperties(client, clientForm) entre ton bean hibernate et le form que tu reçois de ta JSP et de faire un save/update/delete sur ton objet client !

    Je te conseille le reste des tuto hibernate ici.

    Oups, j'avais pas vu la gestion des clées étrangères, mais c'est expliqué là par tchize_

    Et un tutoriel sur les différents mapping existants avec hibernate.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2011
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 97
    Par défaut
    Bonjour Drakiss
    Citation Envoyé par Drakiss Voir le message
    Oups, j'avais pas vu la gestion des clées étrangères
    Oui effectivement, j'ai déjà intégré hibernate, j'arrive a l'utiliser, mais c'est cet aspect que je ne maitrise pas encore

    Je te remercie pour tes autres liens, je regarde ca dessuite et je te tiens au courant

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2011
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 97
    Par défaut
    Le tuto de tchize m'a aidé en effet, en ce qui concerne mon insert, ca marche nikel

    La ca se complique, c'est lors d'un update, j'ai repris le meme principe, à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    client.setCoordonnees(coordonnees);
    session.update(client);
    Mais ici, ca me rajoute une ligne dans ma table coordonnees, au lieu de modifier l'ancienne :/
    Et si j'enlève le client.setCoordonnees(coordonnees); , ma coordonnées n'est pas modifiée, et mon champ "coordonnees_id" de ma table client passe a Null ...

    Je précise que dans mon fichier Client.hbm.xml (classe qui contient la clé étrangère vers Coordonnées) j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <many-to-one class="fr.model.Coordonnees" cascade="all" fetch="select" name="coordonnees">
          <column name="coordonnees_id"/>
    </many-to-one>

  5. #5
    Membre chevronné Avatar de Drakiss
    Homme Profil pro
    Consultant MOE
    Inscrit en
    Octobre 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Consultant MOE
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2010
    Messages : 185
    Par défaut
    Bonjour, ma première question est :
    Est-ce que tu fait load ou un get du client ?
    La différence est, est-ce que tu va chercher le client en base ou dans la session ?

    Deuxièmement pour moi remplace le cascade="all" par cascade="all-delete-orphan" ou cascade="save-update".

    Test le fetch="join", pour charger les objets par jointure et non par select.

    Je rajouterai un petit insert="false" update="false" dans le coordonnés.hbm.xml pour empêcher que les coordonnée ne s'insère ou ne s'update, et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <column name="coordonnees_id" not-null="true"/ >
    dans le Client.hbm.xml, pour éviter de rentrer un client sans coordonnées.

    Ça devrait rouler...
    ou pas puisque la dernière question est : est-ce que tes identifiants sont générés ou assignés ?
    En gros, est-ce que tu laisse la base donner la clée ou tu la produit par toi même ?
    Si tu la produit "à la main" sache qu'il va te falloir un numéro de version sur l'enfant (coordonnées) et donc refaire ta base car Hibernate est incapable de faire une comparaison entre un nouvel objet instancié et un objet loadé dans la session...

    Désolé pour le pavé, je réfléchissait en même temps que j'écrivai, mais je te laisse le cheminement car j'ai évoqué des points important il me semble

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2011
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 97
    Par défaut
    Bonjour Drakiss,
    Citation Envoyé par Drakiss Voir le message
    Est-ce que tu fait load ou un get du client ?
    Pour remplir mon formulaire (lors de l'édition) je fais un "get" (j'ai testé avec un load, ca me fait pareil)

    Citation Envoyé par Drakiss Voir le message
    Deuxièmement pour moi remplace le cascade="all" par cascade="all-delete-orphan" ou cascade="save-update".
    Je veux bien, mais quelle est la différence entre "all" et "all-delete-orphan" stp ?

    Citation Envoyé par Drakiss Voir le message
    Test le fetch="join", pour charger les objets par jointure et non par select.
    La encore, il y a t-il une différence notable ? (c'est une vraie question, je ne maîtrise pas encore le sujet )

    Citation Envoyé par Drakiss Voir le message
    Je rajouterai un petit insert="false" update="false" dans le coordonnés.hbm.xml pour empêcher que les coordonnée ne s'insère ou ne s'update, et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <column name="coordonnees_id" not-null="true"/ >
    dans le Client.hbm.xml, pour éviter de rentrer un client sans coordonnées.
    Je laisse la possibilité de rentrer un client sans coordonnees, c'est tout a fait possible dans mon projet (merci quand même)

    Citation Envoyé par Drakiss Voir le message
    Ça devrait rouler...
    ou pas puisque la dernière question est : est-ce que tes identifiants sont générés ou assignés ?
    Mes ID sont générés

    Actuellement, ca marche très bien pour moi, mais j'ai du mettre une "rustine" : dans mon formulaire d'édition, je passe l'ID de mes coordonnees, en hidden ... Ce n'est pas très propre, j'aimerai pouvoir faire autrement

    J'ai testé tes méthodes, et si je vire ce champ hidden, je récupère ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Client: Client{id=79, coordonnees=null, nom=unNom, prenom=unPrenom}
    Coordonnees : Coordonnees{id=0, fixe=0000000, mobile=, adresse1=, adresse2=, email=, cp=, ville=}
    Je récupère un ID coordonnees = 0 alors que je devrais récupérer par exemple id=43

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

Discussions similaires

  1. Gestion des clés primaires et étrangères
    Par jonrod dans le forum Designer
    Réponses: 5
    Dernier message: 10/04/2012, 10h38
  2. SQLite Release 3.6.19 : Gestion des clés étrangères
    Par Emmanuel Lecoester dans le forum SQLite
    Réponses: 22
    Dernier message: 19/11/2009, 15h06
  3. [MySQL] Insertions et gestion des clés étrangères
    Par b_e_n_n dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 15/06/2008, 16h14
  4. Réponses: 5
    Dernier message: 05/10/2006, 19h07
  5. Gestion des clés étrangères
    Par Gonelle dans le forum HyperFileSQL
    Réponses: 1
    Dernier message: 06/07/2006, 10h48

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