2009-03-03 4 views
0

Für mein aktuelles Projekt muss ich eine ältere Datenbank mit Hibernate zuordnen, aber ich stoße auf einige Probleme. Die Datenbank wird mit einer Entity-Tabelle eingerichtet, die allgemeine Eigenschaften für alle Domänenobjekte enthält. Zu den Eigenschaften gehören (unter anderem) das Erstellungsdatum, der Eigentümer (Benutzer) und ein Primärschlüssel, der anschließend in den Tabellen für die Domänenobjekte verwendet wird.Legacy Mapping mit Hibernate

Eine einfache Darstellung des Kontextes ist als solche:

table entity 
- int id 
- varchar owner 

table account 
- int accountid (references entity.id) 

table contact 
- int contactid (references entity.id) 
- int accountid (references account.accountid) 

Mein Problem selbst zeigt, wenn ich versuche, eine Sammlung Mapping auf mein Konto Mapping hinzuzufügen, alle Kontakte enthält, auf das Konto gehört. Meine Versuche einkochen auf die folgenden:

<hibernate-mapping> 
    <class name="Contact" table="entity"> 
     <id name="id" column="id"> 
      <generator class="native" /> 
     </id> 
     <join table="contact"> 
      <key column="contactid"/> 
      <!-- more stuff --> 
     </join> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping> 
    <class name="Account" table="entity"> 
     <id name="id" column="id"> 
      <generator class="native" /> 
     </id> 


     <bag name="contacts" table="contact"> 
      <key column="accountid" /> 
      <one-to-many class="Contact"/> 
     </bag> 

     <join table="account"> 
      <key column="accountid"/> 
      <!-- more stuff --> 
     </join> 

    </class> 
</hibernate-mapping> 

Allerdings, wenn ich versuchen, das Konto, das ich einen SQL-Fehler erhalten zu holen, die besagt, dass die Objekt-Tabelle enthält keine Spalte namens accountid. Ich verstehe, warum dies geschieht: Das Mapping versucht, die Accountid-Spalte in der Entitätstabelle zu finden, wenn ich es in der Kontakttabelle suchen möchte. Fehle ich hier etwas Offensichtliches, oder sollte ich dieses Problem aus einer anderen Richtung angehen?

Antwort

3

Dies sieht für mich so aus, als müssten Sie tatsächlich eine Vererbung zuordnen, indem Sie das Table Per Subclass-Paradigma verwenden.

Etwas wie folgt aus:

<class name="entity" table="entity"> 
    <id name="id" column="id"> 
     ... 
    </id> 

    <joined-subclass name="contact" table="contact"> 
     <key column="contactid"/> 
    </joined-subclass> 

    <joined-subclass name="account" table="account"> 
     <key column="accountid"/> 
    </joined-subclass> 
</class> 

, die übrigens ungefähre ist - es ausführlich in Abschnitt 9.1.2 der Hibernate-Dokumentation beschrieben ist (nur, wenn Sie es nicht finden können, nennt man das „Table pro Unterklasse").

Prost

Reiche

+0

Voll ack für die Vererbung Teil. – boutta

+0

Ich neige dazu, diese Antwort zu akzeptieren. Allerdings warte ich zuerst auf weitere Antworten, ich hasse es zu akzeptieren und dann eine Antwort zu akzeptieren. +1 mindestens ;-) –