2017-06-07 2 views
0

Ich habe zwei Klassen C1 und C2. Jedes beharrt auf seinem eigenen Tisch. Jede hat ihre eigene Hibernate-XML-Beschreibung und erwähnt ihre eigene Tabelle. Zwischen diesen Klassen besteht überhaupt keine Verbindung.Wie bekomme ich Hibernate, um Unterklassen zu ignorieren?

Außer dass C1 eine Unterklasse von C2 ist.

Offensichtlich kopiert C1 XML viel von C2 (mit einigen Sachen hinzugefügt), aber es ist eine separate Kopie. Nochmal: Keine XML-Datei erwähnt die andere Klasse oder die andere Tabelle.

Aber jetzt, wenn ich eine "From C2" -Abfrage mache, zieht Hibernate alle beiden Tabellen ein.

Logischerweise macht dies Sinn: ein C1 ist in der Tat ein C2, also wenn ich alle C2s will, brauche ich auch die C1s, also müssen wir alle C1-Tabelle lesen. Hibernate muss Reflektion verwenden, um Unterklasse C1 von C2 zu erkennen.

Angenommen, dies ist das erwartete Verhalten (obwohl es von mir nicht erwartet wurde!) Wie vermeide ich es? Gibt es eine Möglichkeit, Hibernate zu sagen, dass wenn ich "Von C2" sage, ich wirklich nur C2 und nicht C1 zum Booten meine? Gibt es eine Klausel, die ich der Abfrage hinzufügen kann, die sie auf Objekte nicht vom Typ C1 beschränkt, und die Leistungseinbußen bei der Abfrage der Tabelle von C1 überhaupt vermeidet?

Antwort

2

Wenn Sie C2 auswählen, wird C1 standardmäßig auch im Ruhezustand ausgewählt. Es heißt polymorphe Abfragen. siehe Polymorphic queries und Tutorial.

zu beheben/lösen es Sie in Einheit hinzufügen sollten PolymorphismType.EXPLICIT

@Entity (Polymorphismus = PolymorphismType.EXPLICIT)

von https://docs.jboss.org/hibernate/orm/5.2/javadocs/

IMPLIZIT -Das Unternehmen Wird abgerufen, wenn eine der Super-Entitäten abgerufen wird. Der Standardwert

EXPLICIT -Diese Entität wird nur abgerufen, wenn explizit gefragt wird.

+0

'PolymorphismType.EXPLICIT' auf C1 oder C2? –

Verwandte Themen