Hibernate 2. Ebene Cache -Objekte, die faul sind = false, führen zu einem Standard -Fetch = Join, wird es irgendwo dokumentiert?

StackOverflow https://stackoverflow.com/questions/1968767

Frage

Ich erlebe das folgende Problem ohne Papiere, und ich möchte verstehen, ob

  1. Ich habe etwas falsch gemacht
  2. Ist jemand auf das gleiche Problem gestoßen?
  3. Ist es wirklich nirgendwo dokumentiert? Oder habe ich etwas vermisst?

Das Verhalten ist dies aus der folgenden Zuordnung

<class name="org.sample.Foo" table="foo">
    ...
   <many-to-one name="bar" class="org.sample.Bar"/>
</class>


<class name="org.sample.Bar" table="bar" lazy="false">
    ...
</class>

Erstens als Hintergrund, hinte der Standardwert für die Hibernate bringen Das Attribut für eine viele zu eins-Beziehung sollte sein "auswählen", Dies ist zumindest das, was dokumentiert ist (ich werde den Link hier hinzufügen, wenn ich ihn finde)

Dies gilt jedoch anscheinend nur, wenn die referenzierte Klasse faul ist = "True"!

Anscheinend wird die obige Zuordnung in dieses übersetzt (weil die Bar faul ist = "Falsch"):

<class name="org.sample.Foo" table="foo">
    ...
   <many-to-one name="bar" class="org.sample.Bar" *fetch="join" />
</class>


<class name="org.sample.Bar" table="bar" lazy="false">
    ...
</class>

Warum sollte das ein Problem sein? Anstelle von 2 Auswahl laden Hibernate die nicht faule Referenz in einer einzigen Auswahl mit dem "Elternteil" (laden Sie Foo mit Balken in einem einzelnen Select).

Dies macht tatsächlich Sinn, da das Objekt nicht faul ist, warum nicht laden?

Die Antwort lautet: Was passiert, wenn die Bar im 2. Level -Cache liegt?

<class name="org.sample.Foo" table="foo">
    ...
   <many-to-one name="bar" class="org.sample.Bar" *fetch="join" />
</class>


<class name="org.sample.Bar" table="bar" lazy="false">
    <cache usage="transactional" />
    ...
</class>

Und die Antwort darauf ist - nichts ändert sich!

Anscheinend würde man annehmen, dass Hibernate klug genug ist, um zu verstehen 2. Stufe Cache noch)

Hibernate macht also das, was es erzählt wird, und nutzt einen Join, um ein Objekt aus der Datenbank zu holen, in der es sich bereits im Cache der 2. Ebene befindet

Die Lösung, die ich gefunden habe, besteht darin, die Zuordnung buchstäblich in Fetch = "Select" zu ändern.

Wenn die zweite Auswahl für Bar bevorsteht, versteht Hibernate, dass er nicht in die Datenbank gehen sollte, und holt sie aus dem Cache ab. und nur eine Abfrage wird ausgeführt (nach dem Aufwärmen)

War es hilfreich?

Lösung

Ich stieß auf das gleiche Problem und markierte alle viele zu eins-zu-Eins-Beziehungen, die wie fetch="select". Zu der Zeit, als die Abfrage aufgebaut ist, kann Hibernate nicht wissen, ob sich die angeforderte Instanz der Bar im Cache der zweiten Ebene befindet oder nicht (vorausgesetzt, Foo ist nicht zwischengespeichert).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top