2008-12-23 100 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)