Frage

Ich arbeite an einem Projekt, das ein reichhaltiges Objektmodell mit verschiedenen Sätzen von aggregierten Wurzeln hat.

Wir sind mit dem Castle Stapeln (Einschienenbahn bis zur nHibernate mit Active).

Wir haben die aggregierten Wurzeln als faul [ActiveRecord(Lazy = true)] markiert und haben maßgeschneiderte ‚eifrig‘ Routinen auf unserem Repository zu eifrig ein Objektgraph holen. Wir verwenden HQL eifrig holt aus unserem Kind Sammlung unserer Wurzel zu definieren,

z. wenn Account ist das Aggregat Wurzel (und markiert faul geladen) werden wir eifrig holen Account .. Order .. Product Einheiten für einen vollständigen Graphen.

Also keine Überraschungen bisher (hoffentlich).

Nun, wenn in dem obigen Beispiel Produkte auch [ActiveRecord(Lazy = true)] markiert sind, scheint dies die eifrig holen Direktive in der HQL zu stoppen.

Kennt jemand eine Möglichkeit, die eifrig holen eines faulen geladenen Kind-Objekt zu zwingen ??

Prost ian

Aktualisieren :

Ok hier einige Beispiele hql, am Beispiel von 'me.yahoo.com/../1' unten, wir IMuliQuery mit N + 1 Abhängigkeiten reslove wenn many-to-many-Beziehungen zu holen über. Wir sind auch mit explizit many-to-many-Mapping-Klassen. Als Ergebnis unserer hql ist:

from Account a 'm eager loading the graph
inner join fetch a.AccountsOrders ao 
inner join fetch ao.Order
from Account a 'm eager loading the graph
inner join fetch a.AccountAddresses aa
inner join fetch aa.Address ad
where a.ID = ?

... so diese führt die 2 SQL-Anweisungen und gibt die erforderliche minimale rowset, und wir können dies in einem einzigen Objektgraphen lösen unten. Nizza.

Aber ... wenn, sagen wir, Address gekennzeichnet war faul geladen (und Order war nicht), Order Zugriff löst keine weitere SQL-Anweisungen, noch Zugriff auf Address hat, trotz der Tatsache, beide sind eifrig geladen.

Also, warum ist nicht die faule geladene Einheit Address, oben, eifrig geholt durch die obige Aussage?

War es hilfreich?

Lösung

Warum wollen Sie das eifrige Verhalten?

Alle von der Beziehung in Active Attribute haben einen ‚Faulen =‘ Parameter das zugehörige Objekt Active zu faul Last zu erzählen. Alle außer Gehört zu. Gehört prüft, ob das abhängige Objekt hat Faul = true in seiner Eigenschaft Active und erstellt dann einen Proxy für das Objekt stattdessen eine ausgewählte oder beitreten zu tun.

Für Lazy Loading alle Methoden und Eigenschaften der Klasse Instanz arbeiten müssen als virtuelle markiert werden. Dies ermöglicht Active eine dynamische Proxy-Klasse zu bauen.

Nun kann es wie eine gute Idee klingt die komplette grafische Darstellung für die Leistung zu holen, aber in der Praxis ist es wahrscheinlich langsamer. Ich habe 3 gute Gründe, warum:

1.) Gehört hat eine Fetch-Option zu definieren, wie verwandte Objekte gezogen werden. FetchEnum.Join Kräfte AR ein Join zu verwenden. FetchEnum. Wählen Kräfte AR für jedes Objekt separate select-Anweisungen zu verwenden. Schließt sie langsam ist, sehen wir eine 10-fachen Leistungsverbesserung von individueller Schalt wählt. Es gibt keinen wirksamen Unterschied in dem Client-Code zwischen Faul = true + FetchEnum.Select und eifrig.

2.) NHibernate funktioniert Caching. Wenn das Objekt bereits in der Sitzung oder in der Ebene-2-Cache zwischengespeichert wird, kann es dort geladen Form und die zusätzliche Arbeit vermeiden.

3). Sie würden in den Fällen auf alle Vorteile der träges Laden verpassen, wo man nicht Teil des Objektgraphen Referenz hat. Auch hier würden Sie mehr Arbeit als nötig tun.

Andere Tipps

Haben eine „innere Verknüpfung holen“ auf der Account.Order.Product Einheit. Anstatt also so etwas wie diese (das ist, was Sie wahrscheinlich schon haben):

"from Account a inner join fetch a.Order where a.ID = ?"

Sagen Sie die Order.Product auch holen:

"from Account a inner join fetch a.Order inner join fetch a.Order.Product where a.ID = ?"

Von "NHibernate in Aktion", Seite 225:

  

NHibernate begrenzt zur Zeit Sie holen nur eine Sammlung eifrig.

Das könnte die zweite Abfrage zum Abrufen der Adressen erklären.

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