Bonjour,
J'utilise Hibernate 3.2.5.ga avec une base de données existante.
Dans cette base de donnée, j'ai trois tables ; appelons les A, B et C selon le schéma suivant (les 3 petits points de suspension signifie qu'il y a du contenu mais que ce dernier n'est pas pertinent ici) :
Code:
create table A (id varchar(255) not null, ... , primary key (id));
create table B (id varchar(255) not null, ..., primary key (id));
create table C (A_id varchar(255) not null, B_id varchar(255) not null, primary key (A_id), unique (A_id), unique (B_id), foreign key (A_id) references A on delete cascade, foreign key (B_id) references B on delete cascade);
La table C sert à définir une association entre un élément de A avec un élément de B ; l'association est optionnelle, cad que des éléments de A peuvent ne pas être associés avec des éléments de B.
Maintenant, j'ai ma couche objet en Java dans une application qui permet la manipulation de ces associations. Dans cette couche objet, la table A est représentée par la classe d'objets ClassA et la table B par la classe d'objects ClassB. L'association en elle-même n'a pas de sens en tant que classe d'objets, mais plus comme attributs d'instance de type ClassB dans ClassA.
Aussi, pour réaliser le mapping entre le modèle de base de données et celui objet, j'ai défini une assiociation plusieurs-à-un (many-to-one) unidirectionnelle sur une table de jointure comme indiqué ci-dessous :
Code:
<class name="package.ClassB" table="B">
<id name="id" column="id" type="java.lang.String" />
<!-- une suite de properties s'ensuit ici -->
...
</class>
<class name="package.ClassA" table="A">
<id name="id" column="id" type="java.lang.String" />
<join table=C"
optional="true">
<key column="A_id"
unique="true"/>
<many-to-one name="field_b"
class="package.ClassB"
column="B_id"
not-null="true"
unique="true"/>
</join>
</class>
Avec un tel mapping, la table C est correctement valorisée lors d'une mise à jour de l'association existante entre un élément de A avec un élément de B, mais pas lorsque l'association est créée entre un élément de A (qui n'avait donc pas d'association auparavant) avec un élément de B.
Exemple de code :
Code:
ClassB b = session.get(idb); // b.getA() == null => pas d'association
ClassA a = session.get(ida);
b.setA(a);
session.update(b);
// malheureusement ici l'association n'a pas été créé en base de données :-(
Ceci me surprend, d'autant plus que tout le reste marche correctement et que ce genre d'association est référencé dans le document
http://www.hibernate.org/hib_docs/v3/re ... ional-join
Auriez vous une idée du problème ? Qu'est ce qui cloche ?
Merci