Datenbankabbildung

Reicht die  Generische Speicherung nicht aus, lassen sich Modellelemente flexibel auf applikationsdefinierte Tabellen in Datenbank abbilden, vgl. Schema-Deklaration.

Klassen

Konkrete Klassen (TLClass) können über die Annotation <table name="..."/> auf Datenbanktabellen abgebildet werden:

<class name="MyClass">
   <annotations>
      <table name="MyTable"/>
   </annotations>
   <attributes>
      ...
   </attributes>
</class>

In obigem Beispiel werden alle Instanzen der Klasse MyClass in der Datenbanktabelle MyTable gespeichert.

Wird eine Klasse A in einer Tabelle T gespeichert, so werden automatisch alle primitiven Eigenschaften von A zu denen es Spalten mit demselben Namen in der Tabelle T gibt, in der entsprechenden Spalte von T gespeichert. Alle anderen Attribute verwenden weiterhin eine generische interne Tabelle für die Speicherung, siehe Generische Speicherung. Dies stellt sicher, dass das Modell zur Laufzeit erweitert werden kann, ohne die Tabellendefinition anpassen zu müssen.

Referenzen

Bei einer Referenz entscheidet die Speicherabbildung über die verwendete Tabelle. Wenn bei der Referenz nichts spezielles angegeben wird, verwendet die Engine eine generische Tabelle für die Speicherung der Referenz:

<class name="A">
   <attributes>
      <reference name="bs" type="B" />
   </attributes>
</class>

<class name="B">
   <attributes>
      ...
   </attributes>
</class>

Möchte man die Datenbankabbildung selbst bestimmen, hat man bei "zu eins" Referenzen (solche, die auf höchstens ein anderes Objekt zeigen, und somit nicht als multiple ausgezeichnet sind) zwei Möglichkeiten: Speicherung in einer separaten Link-Tabelle (singleton-link-storage) oder Speicherung als Fremdschlüssel (foreign-key-storage). Bei "zu-n" Referenzen (solche, die als "multiple" ausgezeichnet sind) wird immer eine Link-Tabelle benötigt (list-storage oder set-storage).

Link Tabelle

Eine Link-Tabelle kann man bei den Speicherabbildungen list-storage und set-storage angeben (jeweils für geordnete oder ungeordnete Referenzen):

Z.B. legt die folgende Definition die Links bs von A nach B in die spezielle Link-Tabelle AB:

<class name="A">
   <attributes>
      <reference name="bs" type="B">
         <annotations>
            <storage-algorithm>
               <set-storage table="AB"/>
            </storage-algorithm>
         </annotations>
      </reference>
   </attributes>
</class>

Referenzen über Fremdschlüssel

"Zu-eins" Referenzen kann man auch "inline" als Fremdschlüssel in die Tabelle desjenigen Typs ablegen, der die Referenz enthält. In diesem Fall muss die Tabelle des Typs eine entsprechende Fremdschlüsselspalte definieren, vgl. Schema-Deklaration. Die Referenz muss den foreign-key-storage verwenden und darin angeben, in welche Fremdschlüsselspalte gespeichert werden soll. In diesem Fall gibt es keinen Defaultwert für den Spaltennamen, sondern dieser muss immer explizit angegeben werden. Aus technischen Gründen muss auch der Name der Tabelle, in der der Typ selbst gespeichert wird, in dem Fremdschlüsselattribut nochmals wiederholt werden:

<class name="A">
   <annotations>
      <table name="ATable"/>
   </annotations>

   <attributes>
      <reference name="bs" type="B">
         <annotations>
            <storage-algorithm>
               <foreign-key-storage
                  storage-attribute="bsKey"
                  storage-type="ATable"
               />
            </storage-algorithm>
         </annotations>
      </reference>
   </attributes>
</class>

Obige Deklaration gibt an, dass Instanzen von A in der Tabelle ATable gespeichert werden sollen. Die "zu-eins" Referenz bs soll in der Fremdschlüsselspalte bsKey gespeichert werden.

Gibt man bei Referenzen keinen storage-algorithm an, wählt die Engine aufgrund der Referenzauszeichnung (multiple, ordered) eine passende Implementierung mit einer generischen Tabelle für die Speicherung.

Für die Definition von Datenbanktabellen und Fremdschlüsselspalten siehe Schema-Deklaration.