除非class ... lazy = true,否则NHibernate不会创建代理

时间:2012-08-15 11:36:11

标签: nhibernate nhibernate-mapping

考虑以下对象:

public partial class Record
{
    public int RecordID {get; set;}
    public DateTime? Created { get; set; }
    public int CreatorUserUserObjectNDX { get; set; }
    public UserObject Creator { get; set; }
    ...
}

public partial class UserObject
{
  public virtual int ID {get; set;}
  public virtual string Name {get; set;}
}

和他们的映射如:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="..." namespace="..." assembly="...">
<class name="Record" table="records" lazy="false" schema="..">
    <id name="RecordID" column="ndx">
        <generator class="native" />
    </id>
    <property name="Created" column="created" />
    <property name="CreatorUserUserObjectNDX" column="creator_user_user_object_ndx" />

    <many-to-one name="Creator" column="creator_user_user_object_ndx" lazy="proxy"/>
</class>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="..." namespace="..." assembly="...">
<class name="UserObject" table="user_objects" lazy="false">
    <id name="NDX" column="ndx">
        <generator class="native" />
    </id>

    <property name="Name" column="name" />
</class>

它们在这里有意保持简单,实际上它们对于一对多的收藏品等更为沉重,但这些都有用,所以它们不是重点。

我遇到的问题是,当我使用定义&amp;像这样的映射,做一个简单的

var results = session.QueryOver<Record>()
  .List();

NHibernate不会为creator属性创建代理,它只在执行的SQL语句中使用左外连接并直接插入UserObject。 当我在UserObject的映射中将lazy='false'更改为lazy='true'时,它就会生成代理,并且执行的SQL没有外部联接。

那么,是否必须为所有类设置lazy='true',这可能是任何地方的参考?我认为我可以使用默认情况下将其设置为false用于所有映射,并在需要时在多对一定义中设置lazy='proxy'

我使用NHibernate 3.2,所以没有关于proxyfactory的配置。我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

如果在映射中设置了lazy = false,则NHibernate不需要创建代理,因为所有属性都会被急切加载。

除非您需要进行急切加载,否则不应更改延迟加载设置。即使这样,你也可以使用“fetch”(例如在hql中)急切地加载你需要的东西。