3 Stimmen

Hibernate-Abrufstrategie bei Verwendung einer Tabelle pro Klassenhierarchievererbung

Hallo ich verwende die Vererbungsabbildung mit einer Tabelle pro Klassenhierarchie für Altdaten, wie hier beschrieben

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/inheritance.html#inheritance-tableperclass

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

0voto

Stevi Deter Punkte 1583

Ich müsste tief in den Code eindringen, um das zu überprüfen, aber ich vermute, dass dies einfach die Art und Weise ist, wie Hibernate gemappte Assoziationen wie diese behandelt - es wird immer einen Datenbankaufruf pro hydrierter Assoziation durchführen.

Ein alternativer Ansatz besteht darin, eine zugeordnete Hibernate-Auflistung, Notes, zu haben und dann transiente Felder für refundNotes usw. zu haben.

Im Getter für Ihre spezifischen Typen iterieren Sie über die Notizensammlung, um die spezifischen Notizen von Interesse zu finden. In Ihrem Setter fügen Sie sie der allgemeinen Notizensammlung hinzu.

Auf diese Weise führt Hibernate eine einzige Abfrage durch, um die Notizen abzurufen, und Sie können die hydrierten Objekte nach Bedarf bearbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X