-->
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.  [ 1 post ] 
Author Message
 Post subject: Association many-to-many sur une clé candidate comme FK
PostPosted: Thu Aug 13, 2009 5:52 am 
Newbie

Joined: Thu Aug 13, 2009 4:30 am
Posts: 1
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.


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

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.