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 :

Relation 1-n unidirectionnelle - Valorisation de la clé étrangère


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Points : 68
    Points
    68
    Par défaut Relation 1-n unidirectionnelle - Valorisation de la clé étrangère
    Bonjour,

    J'ai une relation 1-n entre une classe A et une classe B. La classe A contient un Set<B>, la classe B ne possède pas de référence vers son parent A (relation 1-n unidirectionnelle). Une cascade all-delete-orphan est définie pour cette relation.

    Ci-joint la partie de A.hbm.xml mise en jeu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <!-- Association 1-n with B -->
    <set name="bs" cascade="all-delete-orphan">
    	<key column="A_ID" />
    	<one-to-many class="B" />
    </set>
    Mon problème est le suivant :
    Lorsque je sauvegarde une instance de A avec un Set<B> rempli, Hibernate réalise, pour chaque élément du Set, un INSERT dans la table correspondant à B. Cet INSERT ne valorise pas la clé étrangère (pointant vers clé primaire de la table A). La valorisation de la clé étrangère s'effectue dans un second temps dans un UPDATE dédié.
    Or, afin d'assurer une certaine qualité de données, la clé étrangère de la table B n'est pas nullable, car l'existence d'une instance de B n'a pas de sens si elle n'est pas rattachée à un propriétaire A. Le premier INSERT plante donc.

    Avant la série d'INSERT pour les éléments du Set<B>, un INSERT dans la table A correspondant à l'instance de A que je souhaite sauvegarder a bien sûr été effectué.

    Avec une relation bidirectionnalle et l'attribut inverse="true", la valorisation de la clé étrangère s'effectue bien dès l'INSERT.

    Hibernate n'est-il pas capable de valoriser la clé étrangère dans l'INSERT, même pour une relation unidirectionnelle, comme le ferait une application basique en JDBC ?! Etant donné que l'INSERT dans la table A a déjà été effectué, la valeur de la clé primaire de l'enregistrement de A est connue. Pourquoi Hibernate ne l'insère pas pour valoriser la clé étrangère dans les INSERT suivants pour la table B ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    J'ai fait la même remarque et la même conclusion : j'utilise donc une relation bidirectionnelle comme le recommande la doc.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Points : 68
    Points
    68
    Par défaut
    Il est bien dommage que cet outil n'arrive pas à faire une chose qui me paraît relativement simple.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/02/2015, 14h59
  2. Réponses: 2
    Dernier message: 18/02/2010, 13h57
  3. Relation unidirectionnel - ManyToOne
    Par jsebfranck dans le forum JPA
    Réponses: 9
    Dernier message: 25/06/2009, 10h22
  4. relation 1/n et valorisation de foreign key
    Par piedsvelus dans le forum Hibernate
    Réponses: 10
    Dernier message: 09/07/2007, 17h23
  5. Cascade et Relation Unidirectionnelle
    Par mehdi_31 dans le forum Hibernate
    Réponses: 7
    Dernier message: 26/08/2006, 16h50

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