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