These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: Mapping d'une table d'association portant des attributs
PostPosted: Fri Oct 21, 2005 4:33 am 
Newbie

Joined: Fri Oct 21, 2005 4:26 am
Posts: 2
Hibernate version: 3.0

Bonjour, je suis confronté à un probleme de mapping Hibernate et fait appel à tt expert hibernate me permettant d'avancer.

je cherche a mapper, par hibernate, une table d'association contenant des attributs. Cette table a comme primary key une clé composite consitué des clés de 2 autres tables.
Je souhaiterais qu'hibernate gère lui même l'alimentation, la mise à jour et la suppression des entrées de cette table, à travers les évènements survenus sur les tables qui lui sont associés.

Explication du fonctionnement :

(les tables SQL et classes Java sont détaillées à la fin de ce mail)

Les objets de type classeB sont créés indépendemment des autres objets et sont écrit en base sans pb.

Lorsque j'instancie des objets de type classeA, je lui ajoute de nouvelles instances d'objets de type ClasseC dans le HashSet.
Ces objets de type classeC ont les variables membres "nombre" et "idClasseB" de renseigné (les instances de classeB ont déjà été entrée en base, les id ont donc été générés et sont connus).
L'idClasseA n'est pas renseigné, c'est l'id correspondant à l'objet "classeA" que nous venons d'instancier et qui sera généré que lors de l'écriture en base.

Explication du probleme :

Je souhaiterais qu'hibernate, lorsqu'il ecrit en base un objet de type ClasseA, crée en cascade tous les éléments de type ClasseC contenus dans son HashSet.
Ceci est facilement obtenu avec le mapping suivant :
Code:
       <set name="listeClasseC" table="tableC" cascade="all" inverse="true" >
           <key column="id_tableA_fk" />
           <one-to-many class="ClasseC" />
       </set>

1er probleme :
la tableC contient une clé composite consitutée des champs id_tableA_fk et id_tableB_fk.
Voici le mapping de la clé composite de la tableC :
Code:
       <composite-id>
           <key-many-to-one
               name="classeA"
               class="ClasseA"
               column="id_tableA_fk"
            />
           <key-many-to-one
               name="classeB"
               class="ClasseB"
               column="id_tableB_fk"
            />
       </composite-id>

Lorsqu'hibernate cherche à créer les lignes dans la tableC, l'identifiant de la classeB étant déjà renseigné, hibernate génère une requete de type update et non pas insert, malgré que l'identifiant de la classeA soit a null.
Pour palier à ce probleme, j'ai rajouté l'attribut " unsaved-value="any" " au composite-id, mais je craint qu'il ne cherche a créer systématiquement de nouvelles entrées, même lorsque je cherche à faire une mise à jour.

2eme probleme:
l'identifiant de la classeA n'etant pas encore généré, je souhaiterais qu'hibernate renseigne lui même cet identifiant lorsqu'il créée les lignes en cascade dans la tableC. Ce n'est actuellement pas le cas et l'insert plante à cause de la contrainte not-null sur l'id_tableA_fk.

voici à quoi ressemblent les tables qui nous posent probleme
Code:
CREATE TABLE tableA
(
id_pk int4 NOT NULL,
nom varchar(30) NOT NULL,
commentaire varchar(200),
CONSTRAINT pk_tableA PRIMARY KEY (id_pk),
CONSTRAINT tc_tableA115 UNIQUE (nom)
)

CREATE TABLE tableB
(
id_pk int4 NOT NULL,
nom varchar(30) NOT NULL,
.....
CONSTRAINT pk_tableB11 PRIMARY KEY (id_pk),
CONSTRAINT tc_tableB53 UNIQUE (nom)
)

CREATE TABLE tableC
(
id_tableA_fk int4 NOT NULL,
id_tableB_fk int4 NOT NULL,
nombre int2 NOT NULL,
CONSTRAINT fk_tableC19 FOREIGN KEY (id_tableA_fk) REFERENCES tableA (id_pk) ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_tableC20 FOREIGN KEY (id_tableB_fk) REFERENCES tableB (id_pk) ON UPDATE NO ACTION ON DELETE NO ACTION
)

Les objets Java correspondant à ces tables sont comme suit :

class classeA {
   public Long id;
   public String nom;
   public String comment;
   public HashSet listeClasseC;
   // ...
   /* getter et setter associés */
}

class classeB {
   public Long id;
   public String nom;
   // ...
   /* getter et setter associés */
}

class classeC {
   public ClasseA classeA;
   public ClasseB classeB;
   public Integer nombre;
   // ...
   /* getter et setter associés */
};

Merci de toute aide que vous pourrez m'apporter.

Guildux

_________________
kentoc'h mervel eget bezañ saotret


Top
 Profile  
 
 Post subject:
PostPosted: Fri Oct 21, 2005 10:02 am 
Newbie

Joined: Fri Oct 21, 2005 4:26 am
Posts: 2
Nous avons trouvé une solution qui consiste a mapper la classe C "dans" la classe A ...

Lors de la déclaration de notre set, nous le faisons comme suit :

Code:
        <set name="listeClasseC" table="tableC" lazy="true">
            <key column="id_tableA_fk" />
            <composite-element class="ClasseC">
                <parent name="classeA" />
                <many-to-one name="classeB" class="ClasseB" column="id_tableB_fk" not-null="true" />
                <property column="nombre" name="nombre" not-null="true" type="integer" />
            </composite-element>
        </set>

_________________
kentoc'h mervel eget bezañ saotret


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.