-->
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: Hierarchy Mapping (gemixte O/R-Strategie)
PostPosted: Fri Sep 24, 2010 9:40 am 
Newbie

Joined: Fri Sep 24, 2010 8:20 am
Posts: 5
Hallo zusammen,

Mein Problem besteht darin, dass ich nicht herausfinden konnte, wie ich Hierarchien über mehreren Ebenen in den Mapping Klassen darstellen kann. Über eine Ebene ist klar z.B. über <joined-subclass> oder <subclass> mit <discriminator> je nach Strategie. Aber diese Tags lassen sich nicht beliebig schachteln. Vielleicht könnt ihr mir helfen.

Ich habe ganz unten versucht mein Problem kurz und knapp zu formulieren, wenn sich jemand die ausführliche Beschreibung meines Problems nicht antun will. ;)

Ein Minimalbeispiel aus dem Gesamtmodell sieht folgendermaßen aus:

"Datenbankobjekt" (A) ist abstract und hat Instanzen vom Typ "Source" (B) oder "Person" (C).
"Source" (B) wiederum kann Instanzen vom Typ "Institution" (D) oder Datenbank (E) haben.
Person besitzt keine weiteren Unterklassen.

Code:
         A
       /   \
      B    C
     / \
    D  E


Auf Datenbankebene habe ich eine Tabelle "DBOjekte". Dort wird der Primärschlüssel erzeugt der für alle anderen Tabellen sowohl Fremd als auch Primärschlüssel ist. (Alle Tabellen teilen sich also einen Primärschlüssel, der in (A) erzeugt wird.)
Außerdem habe ich eine Tabelle für Source (B) und eine Tabelle für Person (C).

Hier mal meine Mapping Datei:

Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="vlkb.hibernate.entity">
  <class name="DatabaseObject" table="database_object">
      <id name="db_id" column="db_id" type="long">
          <generator class="sequence">
            <param name="sequence">database_object_db_id_seq</param>
        </generator>         
      </id>       
      <discriminator column="object_type" type="string"></discriminator>
   <subclass name="Person" discriminator-value="person">
        <join table="person">   
        <key column="db_id" />       
         <property name="sex" column="sex" type="string" length="128" not-null="true" />   
          <property name="title" column="title" type="string" length="32" />
          <property name="first_name" column="first_name" type="string" length="128" />
         <property name="last_name" column="last_name" type="string" length="128" /> 
         <many-to-one name="affiliation" column="affiliation" class="vlkb.hibernate.entity.Source" not-null="true"/>
         <property name="telephone" column="telephone" type="string" length="64" />
         <property name="email" column="email" type="string" length="256" />
         <property name="address" column="address" type="string" length="256" />
        </join>       
    </subclass>
    <subclass name="Source" discriminator-value="source">   
        <join table="source">       
        <key column="db_id" />       
         <property name="source_type" column="source_type" type="string" length="128" not-null="true" />   
          <property name="acronym" column="acronym" type="string" length="32" />
          <property name="name" column="name" type="string" length="256" />
          <property name="address" column="address" type="string" length="256" />
          <property name="url" column="url" type="string" length="256" /> 
        </join>         
    </subclass>   
    </class>   
</hibernate-mapping>


Der Code so wie er oben ist, funktioniert noch.

Ich suche jetzt eine Möglichkeit Source abstract zu behandeln und auf die konkreten Klassen Datenbank und Institution zu verweisen. Und die Mapping Datei dahingehend anzupassen.

In die Subklassen weitere Subklassen zu schachteln funktioniert irgendwie nicht, da dann Institution und Datenbank direkt auf DatenbankObjekt mappen, statt auf Source. Außerdem kann ich keinen neuen Discriminator für source definieren, weil dieser in einer <subclass> nicht definiert ist.

Code:
   
...
<subclass name="Source" discriminator-value="source">   
        <join table="source">       
        <key column="db_id" />       
         <property name="source_type" column="source_type" type="string" length="128" not-null="true" />   
          <property name="acronym" column="acronym" type="string" length="32" />
          <property name="name" column="name" type="string" length="256" />
          <property name="address" column="address" type="string" length="256" />
          <property name="url" column="url" type="string" length="256" /> 
        </join> 
        <subclass name="Database" ></subclass>
        <subclass name="Institution" >
            <property name="version" column="version" type="string" length="128"/>
        </subclass>
    </subclass>         
...


Definiere ich eine neue Klasse Source, kann ich zwar den Discriminator definieren der meine SourceObjekte unterscheidet, allerdings scheitere ich daran, dass eine <class> immer eine ID benötigt, die ich aber für alle Objekte aus der Tabelle Datenbankobjekt erben möchte. Und ja eigentlich auch schon in Datenbankobjekt definiert habe.

Code:
   
<class name="Source" table="source">   
    <discriminator column="source_type" type="string" />
        <subclass name="Database" discriminator-value="database"></subclass>
        <subclass name="Institution" discriminator-value="institution">
            <property name="version" column="version" type="string" length="128"/>
        </subclass>
    </class>


Bitte helft mir! Ich weiß echt nicht mehr weiter. Oder unterstützt Hibernate keine mehrstufigen Hierarchien?
Ich versuch mein Problem nochmal kurz und prägnant zu formulieren:

Ich würde sagen, ich suche ein Mapping der Art :

1) D,E extends B und B,C extends A (siehe Bild oben)
2) Auf Datenbankebene gibt es nur eine Tabelle für A,B und C. (Table per class gemixt mit Table per Class Hierarchy)
3) D und E werden in B gespeichert und über eine Typspalte unterschieden.
4) Alle Instanzen teilen sich den gemeinsamen Primärschlüssel aus A.



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.