Hallo ich verwende die Vererbungsabbildung mit einer Tabelle pro Klassenhierarchie für Altdaten, wie hier beschrieben
So sieht mein Mapping ungefähr aus
<class abstract="true" name="note" table="NOTES">
<id name="id" type="long" column="NOTE_ID">
<generator class="native"/>
</id>
<discriminator column="NOTE_TYPE" type="string"/>
<property name="orderId" column="ORDER_ID"/>
<property name="text" column="TEXT"/>
<subclass name="PurchaseNote" discriminator-value="PUR" />
<subclass name="CancelNote" discriminator-value="CAN" />
<subclass name="RefundNote" discriminator-value="REF" />
</class>
Zu jeder Auftragskennung kann es viele Unterklassen von Notizen geben
Die Notizen werden als Assoziationen in einer Auftragsklasse beschrieben, etwa so
<class name="order" table="ORDERS">
<id name="id" type="long" column="ORDER_ID">
<generator class="native"/>
</id>
.....
<set name="purchaseNotes">
<key column="orderId" />
<one-to-many class="PurchaseNote"/>
</set>
<set name="cancelNotes">
<key column="orderId" />
<one-to-many class="cancelNote"/>
</set>
<set name="refundNotes">
<key column="orderId" />
<one-to-many class="refundNote"/>
</set>
</class>
Ich kann die zugehörigen Sammlungen von Hibernate abrufen, wenn ich Folgendes tue.
1) Verwenden Sie eine "Where"-Klausel in der Set-Definition in der Reihenfolge xml oder 2) Verwenden Sie ein force="true" als Teil der Diskriminatordefinition in der notes xml
Ich kann auch in einem DAO-Aufruf durch eine Hibernate-Sitzung aus einer Sitzungsfabrik die HQL verwenden "from RefundNote where orderId = ?" oder "from Note note where note.class = RefundNote and orderId = ?" verwenden, um eine Liste der korrekten RefundNote-Unterklassen zu erhalten und die Liste in der Klasse Order aufzufüllen, indem der Setter auf refundNotes verwendet wird.
Alles Standard-Winterschlaf?
Jede dieser Methoden wird die Sammlungen erstellen, die 3 Abfragen (eine für jede Sammlung) an dieselbe Tabelle abfeuern. Da die Anzahl der Unterklassen wächst dies scheint ineffiecient....?
Ich habe viel gelesen, aber kann keine Möglichkeit sehen, dass Hibernate (durch Fetch-Strategien, Join, Subselect, etc.) diese Aufrufe zu einem einzigen DB-Aufruf minimieren könnte und noch meine Sammlungen auffüllen.....?
Ich kann alle Notizen und Iteration durch in Java, um die Sammlungen durch class.simpleName Inspektion zu bauen, aber frage mich, wenn ich etwas Hibernate tun..... vermisse?
Danke für jeden Ratschlag