2008-12-23 64 views
15

nhibernate中的一對一關係可以延遲加載「false」或「proxy」。我想知道是否有人知道如何做一個懶惰的一對一映射。NHibernate:如何在一對一映射中啓用延遲加載

我通過使用映射到私有字段的惰性集合來獲得相同的結果,並讓公有屬性返回該集合的第一個結果。它的作品,但不是最乾淨的代碼...

在此先感謝!

回答

20

除非關聯是強制性的,否則不支持一對一的延遲加載。推理請參見here

歸結爲,爲了確定關係的另一方是否存在(N),Hibernate必須去數據庫。由於您已經將數據庫命中,因此您可以加載完整的對象。

雖然有些情況下只需點擊數據庫來查看相關對象是否存在,但實際上並沒有加載該對象是有意義的(如果相關對象非常「沉重」),它目前在NHibernate中不受支持。

+0

除非協會是強制性的,否則你是什麼意思? – cbp 2012-03-28 07:46:56

4

據我所知,沒有一種非hacky的方式來延遲加載一對一。我希望我錯了,但最後一次檢查是這樣。

+4

2015年的任何進展都是關於這個問題的? – 2015-05-03 10:53:01

+0

由於[2010年1月](https://ayende.com/blog/4378/nhibernate-new-feature-no-proxy-associations),支持lazy =「no-proxy」`,但由於方式可以在非「約束」方面進行延遲加載(見NH4)。 (延遲加載在'受約束'方面被支持了很長時間,但很多人錯過了這一點。請參閱[答案](/ a/389345/1178314)。) – 2016-03-21 23:42:42

3

有想法。它的詳細描述爲here

<?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> 
1

我試過了上面Artem Tikhomirov使用的例子。我不斷收到照片列不存在的錯誤。在看了this之後,我發現映射稍微有點偏離。當我改變了很多一對一的映射到指定的列名這樣的:

多到一個名稱=「照片」欄=「是PersonID」級=「PersonPhoto」唯一=「真」

我得到它的工作。我希望這可以幫助某人:o)