Lassen Sie uns diesmal über das hierarchische Design von Hibernate sprechen, das die Gestaltung der Erbschaftsbeziehung zwischen Unternehmen ist.
Vielleicht ist dies abstrakter. Schauen wir uns die Beispiele direkt an.
1) Schauen wir uns zunächst die übliche Praxis an und geben Sie den Code direkt ein: Die drei realen Klassen sind wie folgt:
öffentliche Klasse Titem implementiert serialisierbare {// Get/Set -Methode private int id; private Saitenherstellung; privater Zeichenfolge Name; } public class tbook erweitert Titem {// Get/Set -Methode private int pagecount auslassen; } public class TDVD erweitert Titem {// Get/Set Method Private String RegionCode auslassen; }
Hier benötigen wir drei Zuordnungsdateien, der Inhalt lautet wie folgt:
<class name = "titem" table = "item"> <id name = "id" column = "id" type = "java.lang.Ineger"> <generator/> </id> <Eigenschaft name = "name" column = "name" type = "java.lang.string"/> <Eigenschaft name = "ferage table = "book"> <id name = "id" column = "id" type = "java.lang.Ineger"> <generator/> </id> <Eigenschaft name = "name" columne type = "java.lang.Ineger"/> </class> <class name = "tdvd" table = "dvd"> <id name = "id" column = "id" type type = "java.lang.String"/> <Eigenschaft name = "RegionCode" column = "RegionCode" type = "java.lang.String"/> </class>
Sehr gewöhnliche Zuordnungsdateien, kein Unterschied zu den vorherigen.
Schreiben wir eine Testmethode direkt:
public void testSelect () {query query = session.createquery ("from titem"); Listlist = query.list (); Iterator iter = list.Iterator (); while (iter.hasnext ()) {system.out.println ("name:"+(((titem) iter.next ()). getName ());}} Beachten Sie, dass wir hier die Titem -Klasse verwenden, nicht die spezifische Wortklasse. Hier sucht es automatisch nach Unterklassen, die aus der Titem -Klasse geerbt wurden und alle Ergebnisse finden. Dies beinhaltet einen Polymorphismus. Das Klassen -Tag hat den Eigenschaftspolymorphismus, und sein Standardwert ist implizit, was bedeutet, dass das Ergebnis ohne Angabe eines Namens abfragt werden kann. Wenn es explizit ist, bedeutet dies, dass Sie einen bestimmten Klassennamen angeben müssen, bevor Sie das Ergebnis dieses Typs finden.
2) Im vorherigen Beispiel haben wir drei Zuordnungsdateien verwendet. Wenn wir ändern müssen, müssen wir drei Zuordnungsdateien ändern, die für große Projekte nicht möglich sind. Darüber hinaus enthält jede Tabelle entsprechende Felder für die entsprechende Hauptklasse, die überflüssig ist. Wir haben also die folgende Methode.
Die Entitätsklasse ist immer noch die gleiche wie in 1). Wir ändern die Zuordnungsdatei von drei auf eins und behalten nur die Titem -Mapping -Datei bei. Wir müssen jedoch entsprechende Änderungen vornehmen, und der Inhalt ist jetzt wie folgt:
<class name = "titem" table = "item" polymorphism = "explizit"> <id name = "id" column = "id" type = "java.lang.Ineger"> <generator/> </id> <Eigenschaft name = "name" column = "name" type <joined-subclass name="TBook" table="TBOOK"> <key column="id" /> <property name="pageCount" column="pageCount" type="java.lang.Integer" /> </joined-subclass> <joined-subclass name="TDVD" table="TDVD"> <key column="id"/> <property name="regionCode" column = "RegionCode" type = "java.lang.String"/> </angeschlossen-subclass> </class>
Hier haben wir nur eine Zuordnungsdatei, aber es gibt ein Enter-Sub-Class-Tag, das angibt, dass diese Klasse aus der aktuellen Klasse erbt. Hier bezieht sich der Untertabelle auf die beiden Tabellen, die den Unterklassen, Tbook und TDVD entsprechen. In der Eigenschaft werden nur Felder im Subtable angegeben.
Auf diese Weise lautet die generierte Tabelle nach dem Laufen wie folgt:
Die Tabelle, die den beiden Unterklassen entspricht, sind nur die Felder, die wir durch Eigenschaft angeben. Dies vermeidet mehrere Felder in der Tabelle, so dass die Worttabelle nur seine separaten Felder beibehält. Wenn sich die Elementklasse ändert, müssen nicht zu viele Änderungen vorgenommen werden.
3) Lassen Sie uns etwas über eine andere Methode zur Implementierung eines hierarchischen Designs erfahren, das durch Einlegen von Flags in die Tabelle erreicht wird. In der Hibernate -Mapping -Datei implementieren wir sie über das Descriminator -Tag.
Schauen wir uns ohne weiteres das Beispiel an:
Wir haben die Zuordnungsdatei des gestrigen Titems geändert:
<class name="TItem" table="ITEM" polymorphism="explicit"> <id name="id" column="id" type="java.lang.Integer"> <generator /> </id> <discriminator column="category" type="java.lang.String"/> <property name="name" column="name" type="java.lang.String"/> <property name = "herstellen" column = "produzieren" type = "java.lang.String"/> </class>
Als wir die Mitte sahen, fügten wir ein Diskriminator -Tag hinzu, das zeigt, in welchem Feld unsere beiden Unterklassen unterschieden werden.
<subclass name="TBook" discriminator-value="1"> <property name="pageCount" column="pageCount"/> </subclass> <subclass name="TDVD" discriminator-value="2" > <property name="regionCode" column="regionCode"/> </subclass>
Wir sehen diese beiden Absätze, was darauf hinweist, dass der Wert des vom Diskriminators angegebenen Wertes 1 angibt, dass es sich um eine T -Book -Klasse handelt und PageCount einen Wert hat; Wenn der vom Diskriminator festgelegte Feld 2 2 ist, zeigt er an, dass es sich um eine TDVD -Klasse handelt und RegionCode einen Wert hat.
Auf diese Weise müssen wir nur eine Tabelle verwenden, die die Beziehung zwischen ihnen und mehreren Klassen anzeigt. Beachten Sie, dass diese Methode für zu viele Unterklassen nicht gut ist. Es wird zu viele Felder im Haupttisch verursachen und bestimmte Design -Unannehmlichkeiten verursachen.