【问题标题】:NHibernate does not create proxy unless class...lazy=trueNHibernate 不会创建代理,除非 class...lazy=true
【发布时间】:2012-08-15 19:46:26
【问题描述】:

考虑这样的对象:

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>

它们在这里故意保持简单,实际上它们在一对多集合等方面更加繁重,但这些工作,所以它们不是这里的重点。

我遇到的问题是,当我使用这样的定义和映射时,做一个简单的

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 的配置。我在这里错过了什么?

【问题讨论】:

    标签: nhibernate nhibernate-mapping


    【解决方案1】:

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

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

    【讨论】:

    • 但我的问题是,NH 会进行急切加载,除非我在类映射中指定lazy=true 并且我想要延迟加载,而不是急切
    • NH 默认会延迟加载。由于您的类声明中的lazy="false",NH 会在您的情况下进行预加载。
    • 天哪……现在我明白了。那么我的类映射的默认规则是原因吗?所以这确实意味着,当我将lazy设置为false时,这种类型就没有机会进行延迟加载了?
    • 不确定,这就是为什么我更喜欢让 NH 做他的工作,并在每个查询的基础上设置自定义行为。
    • 所以是的,这对我来说已经足够了......谢谢你的时间!
    猜你喜欢
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多