2008-12-23 13 views
15

Eins-zu-eins-Beziehungen innerhalb von nhibernate können entweder "false" oder "proxy" sein. Ich habe mich gefragt, ob jemand einen Weg kennt, ein faules Eins-zu-eins-Mapping zu machen.NHibernate: Aktivieren des verzögerten Ladens bei Eins-zu-eins-Zuordnung

Ich habe einen Hack ausgearbeitet, um das gleiche Ergebnis zu erzielen, indem ich eine Lazy-Menge verwende, die einem privaten Feld zugeordnet ist, und dass die öffentliche Eigenschaft das erste Ergebnis dieser Menge zurückgibt. Es funktioniert, aber ist nicht der sauberste Code ...

Vielen Dank im Voraus!

Antwort

20

Lazy Laden von eins zu eins wird nicht unterstützt, es sei denn, die Zuordnung ist obligatorisch. Siehe here für die Begründung.

Es läuft darauf hinaus, dass, um zu entscheiden, ob die andere Seite der Beziehung besteht (N) Hibernate in die Datenbank gehen muss. Da Sie den Datenbanktreffer bereits ausgeführt haben, können Sie auch das vollständige Objekt laden.

Während es Fälle gibt, in denen die DB nur darauf trifft, ob das zugehörige Objekt existiert, ohne das Objekt tatsächlich zu laden (wenn das zugehörige Objekt sehr "schwer" ist), wird es momentan in NHibernate nicht unterstützt.

+0

Was meinst du mit "es sei denn, die Verbindung ist obligatorisch"? – cbp

+12

Und was, wenn 90% der Zeit Sie nicht einmal die Datenbank treffen werden, um zu sehen, ob es existiert, weil es nicht benutzt wird? Entwickler wissen besser über ihren persönlichen Gebrauch als NHibernate, so etwas sollte unterstützt werden. – BradLaney

+0

@BradLaney, auf nicht eingeschränkt = "wahre" Seite, Lazy Loading durch Proxyfying kann nicht funktionieren, wie in Seans Link erklärt. Aber seit [Anfang 2010] (https://ayende.com/blog/4378/nhibernate-new-feature-no-proxy-associations) wird faul = "No-Proxy" auf Eins-zu-eins und vielen unterstützt -zu einem. Mit dieser Option arbeitet Lazy Loading auf nicht eingeschränkter Seite (getestet mit NH 4), wenn es abgefragt wird (nicht im Falle von direktem Laden: immer noch eifrig abzurufen). Dies führt dazu, dass die Stammentität anstelle der zugehörigen Entität proxyfiziert wird, damit der Aufruf der zugehörigen Entitätseigenschaft abgefangen und getreulich geladen werden kann. –

4

Soweit ich weiß, gibt es keinen nicht-hacky Weg, um eine Eins-zu-Eins-Lazy zu laden. Ich hoffe ich irre mich, aber das letzte Mal, als ich nachgesehen habe, war es so.

+4

Jeder Fortschritt im Jahr 2015 sieht dieses Problem? –

+0

'fazy =" no-proxy "' wird seit [Januar 2010] (https://ayende.com/blog/4378/nhibernate-new-feature-no-proxy-associations) unterstützt, aus einem anderen Grund, aber von der Weg ermöglicht Lazy-Loading auf der nicht eingeschränkten Seite (beobachtet mit NH 4). (Lazy Loading wurde lange auf "Constrained" Seite unterstützt, aber viele Leute vermissen den Punkt. Siehe [Antwort] (/ a/389345/1178314).) –

3

Es gibt einen Gedanken. Es here in Einzelheiten beschrieben:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateTest" namespace="NHibernateTest"> 
    <class name="Person" > 
    <id name="PersonID" type="Int32"> 
     <generator class="identity" /> 
    </id> 
    <property name="LastName" type="String" length="50" /> 
    <property name="FirstName" type="String" length="50" /> 
    <many-to-one name="Photo" class="PersonPhoto" /> 
    </class> 

    <class name="PersonPhoto"> 
    <id name="PersonID" type="Int32"> 
     <generator class="foreign"> 
     <param name="property">Owner</param> 
     </generator> 
    </id> 
    <property name="Photo" type="BinaryBlob" /> 
    <one-to-one name="Owner" class="Person" constrained="true" /> 
    </class> 
</hibernate-mapping> 
+0

Hallo Artem, kennst du deine Frage zu "Flash Media Server ruft keinen application.onDisconnect-Handler auf?" wurde gelöscht ? (http://stackoverflow.com/questions/359727) Ich kann es immer noch wegen meiner Wiederholungsstufe sehen. Soll ich einen Uservoice-Eintrag schreiben, der nach seiner Wiederherstellung fragt? – VonC

+0

Huh. General (ist) ist auf dem Kriegspfad :) Komm von VonC, nimm es ruhig an. Es ist immer noch Ihr Haftungsausschluss auf Ihrer Antwort. Es war ein faires Spiel.Danke für deine Ehrlichkeit. –

+0

Dies funktioniert nicht (selbst wenn die Spalte gemäß der Antwort von David Yates angegeben wird). In einer Reihe von Situationen wird NHibernate sehr verwirrt. – cbp

1

Ich versuchte, das von Artem Tikhomirov oben verwendeten Beispiel. Ich habe immer einen Fehler bekommen, dass die Photo-Spalte nicht existiert. Nachdem ich this angesehen hatte, stellte ich fest, dass das Mapping ein wenig ausgefallen war. Wenn änderte ich die Viele-zu-Eins-Abbildung auf den Spaltennamen wie folgt angeben:

many-to-one name = "Photo" column = "PersonID" class = "PersonPhoto" unique = "true"

Ich habe es zur Arbeit gebracht. Ich hoffe, das hilft jemandem: o)

Verwandte Themen