Frage

Wenn ein Unternehmen A habe mit einem bidirektionalen Ein-oder-Null-zu-Eins-Zuordnung mit Entität B.

Die Zuordnung ist wie folgt:

<class name="EntityA" table="TABLE_A" mutable="true" lazy="true">
    <id name="idA" type="long" column="pk_a" unsaved-value="null">
        <generator class="sequence">
            <param name="sequence">pk_a_seq</param>
        </generator>
    </id>
    <one-to-one name="propertyB" class="EntityB" property-ref="propertyA" constrained="true" outer-join="false"/>
</class>

und

<class name="EntityB" table="TABLE_B" mutable="true" lazy="true">
    <id name="idB" type="long" column="pk_b" unsaved-value="null">
        <generator class="sequence">
            <param name="sequence">pk_b_seq</param>
        </generator>
    </id>
    <many-to-one name="propertyA" class="EntityA" not-null="true" unique="true" lazy="proxy" column="fk_a"/>
</class>

Wenn ich eine HQL-Abfrage zu tun (oder besser gesagt, eine benannte HQL-Abfrage) für Entität, Hibernate lädt eifrig Entität # propertyB mit einer separaten select-Anweisung.

Mein Problem damit ist, wenn mein hql kehrt 1000 Entität ist (mit all ihren eigenen jeweiligen Entität ist mit), Ruhezustand wird n + 1 Abfragen (erste Abfrage tun würde für Entität Rückkehr 1000 Ergebnisse, während die n-Abfragen kommen würde die Entität # propertyB verzögertes Laden auswählen).

Allerdings habe ich nicht die mit der Entität # propertyB die brauchen deshalb bin ich zu faul Last wollen, anstatt sie (ohne Hibernate mit einer separaten SQL-Abfrage verwenden).

Ist das möglich? Und wenn ja, wie mache ich das?

Danke, Franz

War es hilfreich?

Lösung

Ich habe dieses Problem behoben.

Was ich tat, war drehen mit den Namen der Entität # propertyBs das Feld Entität # propertyB in ein Set zu erstellen. Aber ich behielt die Entität # getPropertyB () und der Entität # setPropertyB (Entität propertyB) Accessormethoden.

Die Methodenrümpfe dieser Accessormethoden sind jetzt so etwas wie folgt aus:

public EntityB getPropertyB() {
    return CollectionUtils.get(propertyBs, 0);
}

public void setPropertyBs(EntityB propertyB) {
    propertyBs= Collections.singleton(propertyB);
}

Da ist in meinem Mapping, kartiert ich die Reihe der Entität # propertyBs und geben Sie den Zugriff auf ‚Feld‘.

<set name="scheduledAdInfos" lazy="true" fetch="subselect" access="field" cascade="none" inverse="true">
    <key column="pk_a"/>
    <one-to-many class="EntityB"/>
</set>

Mit diesem Setup können Sie jetzt einen faulen Mapping aus dem Besitz POJO (Entität) in dem im Besitz POJO (Entität) erstellen, selbst wenn TABLE_A von Table_B gehört.

Andere Tipps

Kurze Antwort: Nein, Sie das nicht können, zumindest nicht, ohne die Datenbank zu ändern und die Zuordnung. Sie haben grundsätzlich die Eins-zu-Eins-Abbildung und den Fremdschlüssel Bezug auf Reverse in dem Weg zur Arbeit Sie wollen.


Lange Antwort: Winterschlaf halten kann faul Last Verbände. Die Art und Weise sie dies tut, ist durch ein Proxy-Objekt Injektion, die die ID des referenzierten Objekts enthält.

In Ihrem Fall die Zuordnung so ist, dass die Fremdschlüsselspalte in Table_B ist, das heißt, in dem Sie die Viele-zu-Eins-Abbildung verwendet werden. Wenn Sie also ein B laden, findet Hibernate die FK Referenz in der fk_a Spalte und kann einen Proxy erstellen, die diesen Wert hält. Wenn der Proxy die entsprechende Einheit zugegriffen wird, geladen.

Was passiert, wenn ein Datensatz aus der Tabelle A ausgewählt ist? Hibenate wird ein A-Objekt erstellen, aber in der Lage sein, die propertyB zu füllen, wird es in die Table_B aussehen muß, die entsprechende Zeile zu finden, mit fk_a = a.id. Es gibt keinen anderen Weg für Hibernate, um herauszufinden, was Rekord bei faul Ladezeit zu laden.

Eigentlich wäre dies eine Verbesserung für den Ruhezustand sein, da sie auch in der Lage sein sollte, die Belastung auf andere Tasten während verzögertes Laden zu tun, aber die aktuelle Implementierung erlaubt es nicht, diese, vielleicht können Sie ein Problem aufwerfen.

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