Änderungen

Zur Navigation springen Zur Suche springen
3.297 Bytes hinzugefügt ,  10:36, 25. Aug. 2020
→‎Domain-Modelling in GORM: Erbe: geschrieben (kurzes Kapitel)
|}
== [http://gorm.grails.org/6.1.x/hibernate/manual/#gormComposition Domain-Modelling in GORM: Komposition] ==
Neben Assoziationen unterstützt GORM das Konzept der Komposition/Zusammensetzung. In diesem Fall kann anstelle der Abbildung von Klassen auf separate Tabellen eine Klasse in die aktuelle Tabelle "eingebettet" werden. Zum Beispiel:
{| class="wikitable"
|}
== [http://gorm.grails.org/6.1.x/hibernate/manual/#inheritanceInGORM Domain-Modelling in GORM: Erbe] ==[[Datei:Single Table Inheritance.svg|mini|Tabelle pro VererbungshierarchieQuelle: [https://commons.wikimedia.org/wiki/File:Single_Table_Inheritance.svg?uselang=de Wikimedia]]][[Datei:Class Table Inheritance.svg|mini|Tabelle pro UnterklasseQuelle: [https://commons.wikimedia.org/wiki/File:Class_Table_Inheritance.svg?uselang=de Wikimedia]]][[Datei:Concrete Table Inheritance.svg|mini|Tabelle pro konkrete KlasseQuelle: [https://commons.wikimedia.org/wiki/File:Concrete_Table_Inheritance.svg?uselang=de Wikimedia]]]GORM unterstützt die Vererbung sowohl von abstrakten Basisklassen als auch von konkreten persistenten GORM-Entitäten.
=== Abbildungsverfahren von Vererbungshierarchien ===
Quelle der Beschreibungen: [https://de.wikipedia.org/wiki/Objektrelationale_Abbildung#Abbildung_von_Vererbungshierarchien Wikipedia]
Es gibt im Wesentlichen drei verschiedene Verfahren, um Vererbungshierarchien auf Datenbanktabellen abzubilden.
 
;Tabelle pro Vererbungshierarchie
:(auch Single Table, ''einzelne Tabelle'') Bei diesem Verfahren werden alle Attribute der Basisklasse und aller davon abgeleiteten Klassen in '''einer gemeinsamen Tabelle''' gespeichert. Zusätzlich wird ein sogenannter „Diskriminator“ in einer weiteren Spalte abgelegt, der festlegt, welcher Klasse das in dieser Zeile gespeicherte Objekt angehört. '''Attribute von abgeleiteten Klassen dürfen bei diesem Ansatz aber in den meisten Fällen nicht mit einem NOT-NULL-[[Constraint]] versehen werden.''' '''Außerdem können Beschränkungen der Anzahl erlaubter Spalten pro Tabelle diesen Ansatz bei großen Klassen bzw. Klassenhierarchien vereiteln.'''
;Tabelle pro Unterklasse
:(auch ''Joined'' oder Class Table) Bei diesem Verfahren wird '''eine Tabelle für die Basisklasse angelegt und für jede davon abgeleitete Unterklasse eine weitere Tabelle.''' Ein Diskriminator wird nicht benötigt, weil die Klasse eines Objekts durch eine 1-zu-1-Beziehung zwischen dem Eintrag in der Tabelle der Basisklasse und einem Eintrag in einer der Tabellen der abgeleiteten Klassen festgelegt ist.
;Tabelle pro konkrete Klasse
:(auch ''Table per Class'' oder Concrete Table) Hier werden die Attribute der abstrakten Basisklasse in die Tabellen für die konkreten Unterklassen mit aufgenommen. '''Die Tabelle für die Basisklasse entfällt.''' Der Nachteil dieses Ansatzes besteht darin, dass es nicht möglich ist, mit einer Abfrage Instanzen verschiedener Klassen zu ermitteln.
 
 
 
=== [http://gorm.grails.org/6.1.x/hibernate/manual/#_polymorphic_queries Polymorph-ische Abfragen] ===
<syntaxhighlight lang="groovy">
class Content {
String author
}
class BlogEntry extends Content {
URL url
}
class Book extends Content {
String ISBN
}
class PodCast extends Content {
byte[] audioStream
}
</syntaxhighlight>
 
 
Das Ergebnis der Vererbung ist, dass man die Möglichkeit hat, polymorph abzufragen. Wenn man beispielsweise die Methode <code>list()</code> für die Superklasse <code>Content</code> verwendet, werden auch alle Unterklassen von <code>Content</code> zurückgegeben:<syntaxhighlight lang="groovy">
def content = Content.list() // list all blog entries, books and podcasts
content = Content.findAllByAuthor('Joe Bloggs') // find all by author
 
def podCasts = PodCast.list() // list only podcasts
</syntaxhighlight>

Navigationsmenü