Bonjour,
je cherche à mapper une auto-relation multiples entre des objets Proxy. J'ai donc une table représentant mes objets "Proxy" et une table d'association "ProxyAssociation" ayant 2 clefs étrangères vers cette table "Proxy". Ces 2 clefs étrangères ne pointent cependant pas vers la clef primaire de la table Proxy mais vers une clef candidate composite. Ceci permet d'assurer de plus fort contrôles d'intégrité et de référencer également 2 autres tables qui ne nous intéressent pas dans le cadre de ce problème.
Voici donc les instructions de création des tables:
Code:
CREATE TABLE topology."Proxy" (
proxy_pk integer NOT NULL DEFAULT nextval('topology."Proxy_proxy_pk_seq"'::regclass),
model_fk integer NOT NULL,
revision_cfk_1 integer NOT NULL,
"topologyElement_cfk_1_2" integer NOT NULL,
"elementType_cfk_2" topology."ETopologyElementTypes" NOT NULL,
CONSTRAINT "Proxy_pkey" PRIMARY KEY (proxy_pk),
CONSTRAINT "Proxy_model_fk_key" UNIQUE (model_fk, "topologyElement_cfk_1_2")
) WITH (OIDS=FALSE);
CREATE TABLE topology."ProxyAssociation2" (
"proxyAssociation_pk" integer NOT NULL DEFAULT nextval('topology."ProxyAssociation2_proxyAssociation_pk_seq"'::regclass),
"parentElement_cfk_1" integer NOT NULL,
"childElement_cfk_2" integer NOT NULL,
model_cfk_1_2 integer NOT NULL,
CONSTRAINT "ProxyAssociation2_pkey" PRIMARY KEY ("proxyAssociation_pk"),
CONSTRAINT "ProxyAssociation2_childElement_cfk_2_fkey" FOREIGN KEY ("childElement_cfk_2", model_cfk_1_2)
REFERENCES topology."Proxy" ("topologyElement_cfk_1_2", model_fk) MATCH FULL
ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
CONSTRAINT "ProxyAssociation2_parentElement_pfk_fkey" FOREIGN KEY ("parentElement_cfk_1", model_cfk_1_2)
REFERENCES topology."Proxy" ("topologyElement_cfk_1_2", model_fk) MATCH FULL
ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED
) WITH (OIDS=FALSE);
Pour le mapping, j'ai défini les colonnes "topologyElement_cfk_1_2", et "model_fk" de la table "Proxy" au sein d'un bloc <properties> comme préconisé dans le manuel de référence et utilisé le nom logique ainsi créé dans les attributs "property-ref" des blocs <key> et <many-to-many>. Voici le fichier de mapping que j'ai alors écrit:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="fr.sim.server.data.topology.proxy">
<class name="RevisionProxy"
table='"Proxy"'
schema="topology"
abstract="true"
discriminator-value="-1">
<meta attribute="sync-DAO">false</meta>
<id name="_id"
type="long"
column="proxy_pk"
access="field">
<generator class="sequence">
<param name="schema">topology</param>
<param name="sequence">"Proxy_proxy_pk_seq"</param>
</generator>
</id>
<discriminator column='"elementType_cfk_2"' type="integer" />
<properties name="SECONDARY" unique="true" update="false">
<many-to-one name="_topologyElement"
class="fr.sim.server.data.topology.revision.TopologyElement"
column='"topologyElement_cfk_1_2"'
not-null="true"
access="field"
cascade="all">
</many-to-one>
<many-to-one name="_topologyModel"
column="model_fk"
class="fr.sim.server.data.topology.TopologyModel"
not-null="true"
access="field"
cascade="all">
</many-to-one>
</properties>
<many-to-one name="_revision"
class="fr.sim.server.data.topology.revision.Revision"
column="revision_cfk_1"
not-null="true"
access="field"
cascade="all">
</many-to-one>
<subclass name="AssetTypeProxy" discriminator-value="0">
</subclass>
<subclass name="AssetProxy" abstract="true" discriminator-value="-2">
<subclass name="GroupProxy" abstract="true" discriminator-value="-3">
<set name="_content"
table='"ProxyAssociation"'
schema="topology"
lazy="true"
access="field">
<key property-ref='"SECONDARY"'>
<column name='"parentElement_pfk"' />
<column name='"model_fk"' />
</key>
<many-to-many class="AssetProxy" property-ref='"SECONDARY"'>
<column name='"childElement_pfk"' />
<column name='"model_fk"' />
</many-to-many>
</set>
<subclass name="SiteProxy" discriminator-value="1"></subclass>
</subclass>
<subclass name="DeviceProxy" discriminator-value="2"></subclass>
</subclass>
</class>
</hibernate-mapping>
J'obtiens cependant à l'exécution une erreur :Problème de configuration : property ["SECONDARY"] not found on entity [fr.sim.server.data.topology.proxy.GroupProxy].
J'ai essayé en faisant le lien directement sur la clé primaire, donc sans définir de <properties>, cela est fonctionnel mais ne correspond pas à ce que je souhaite. J'ai également essayé de tout remonter dans la classe RevisionProxy, pensant que les différentes couches d'héritages nuisaient à retrouver la propriété SECONDARY, mais cela ne fonctionne pas mieux, avec la même erreur.
Merci d'avance pour votre aide.