2009-05-08 8 views
3

Ich habe eine Eins-zu-Eins-Beziehung zwischen einem Händler und einem Verkäufer, die mit einem Proxy faul sein sollte. Für die Seite, auf der der Fremdschlüssel definiert ist (der Verkäufer referenziert den Händler), funktioniert das gut. Aber von der anderen Seite funktioniert es nicht - der Verkäufer wird immer eifrig geladen. Ich habe constrained="true" wie in "Some explanations on lazy loading" beschrieben, aber das hat nicht geholfen.Lazy One-to-One mit Proxy funktioniert nicht

Es folgt das verwendete Mapping:

<class name="Role" table="PER_PERSROLE" abstract="true"> 
    <id column="OID" type="long"> 
     <generator class="native" /> 
    </id> 
    <discriminator column="SUBTYPE" type="string" /> 
</class> 

<subclass name="Dealer" extends="Role" discriminator-value="DEAL"> 
    <property name="gpNr" column="GP_NR" type="string" /> 
    <one-to-one name="seller" property-ref="dealer" lazy="proxy" constrained="true" 
     outer-join="false" /> 
</subclass> 

<subclass name="Seller" extends="Role" discriminator-value="SELL"> 
    <many-to-one name="dealer" column="SELLER_DEALEROID" lazy="proxy" 
     outer-join="false" /> 
</subclass> 

Ist es ein Problem, dass beide Klassen in einer Tabelle befinden? Ich sehe, dass die Beziehung streng genommen nicht auf die Datenbank beschränkt ist (sie kann dieses Modell nicht verwenden), aber das Domänenmodell benötigt immer beide Entitäten und die Anwendung stellt dies sicher.

+0

Sie wirklich, wirklich wollen nicht die Hibernate 1-1 Zuordnung zu verwenden : http://www.sworddance.com/blog/2006/10/03/hibernate-nastiness-use-the-one-to-one-mapping/ – Pat

Antwort

0

Ich schätze, Sie laden session.get (id)? Haben Sie versucht, die Instanz mithilfe einer HQL-Abfrage zu laden? Dadurch können Sie in der Abfrage angeben, welche Beziehungen zu eifrig oder faul geladen werden sollen.

HTH

+0

Hallo Tom, ich versuchte load(), get() und an HQL-Abfrage Ich bin mir nicht bewusst, wie ich Hibernate durch eine HQL-Abfrage explizit "lazy load" nennen kann - ich weiß nur von "Join fetch ...", um eine Relation eifrig zu laden, auch wenn sie faul ist. – rudolfson

1

denke ich, dass die Seite, die Sie verknüpft es am besten erklärt, obwohl ich nicht sicher bin, warum es empfiehlt constrained="true" Einstellung. Wenn Sie auf Datenbankebene darüber nachdenken, kann Hibernate nicht feststellen, ob die angegebene Eigenschaft (der Verkäufer des Händlers) null sein soll oder nicht, ohne die Datenbank zu treffen (es muss SELECT ... WHERE OID=:sellerOrDealerId abgefragt werden, um festzustellen, ob Zeilen zurückgegeben werden). Und während es die Datenbank trifft, könnte es auch den Rest der Reihe holen. Von der anderen Seite des Verbandes (Händler des Verkäufers) gibt es keine solchen Probleme, da es bereits die Zeile (und somit die Spalte SELLER_DEALEROID) abgerufen hat.

Ich habe etwas Ähnliches begegnet einmal dies und konnte es lösen, indem der Verein nicht optionale machen (err, nicht-nullable)

+0

Um die Zuordnung jedoch nicht-optional/nicht-nullfähig zu machen, müssen Sie constrained auf true setzen. Zumindest verstehe ich die Beschreibung so. Oder wie hast du das geschafft? – rudolfson