【问题标题】:NHibernate: Change from lazy=true to fetch=join brings back the worldNHibernate:从lazy=true 更改为 fetch=join 带回世界
【发布时间】:2009-10-21 09:46:26
【问题描述】:

我的应用程序中有一个用户对象/映射。每个用户都有一个联系信息列表(电话、电子邮件等)

用户的映射包含:

<bag name="ContactInfo" table="contact_info" lazy="true" cascade="all">
    <key column="contact_id"/>
    <one-to-many class="...ContactInfo, ..."/>
</bag>

这很好,但我遇到了 n+1 选择问题,所以我需要稍微优化一下。但是由于某种原因,当我将其更改为连接并执行一些数据库操作时,NH 开始更新数据库中的所有 contact_info 对象。当我说数据库操作时,我并不是指更改联系人。我的意思是什么。

有人知道为什么吗?谢谢

编辑:刚刚意识到它也适用于lazy="true",但第二次是在加载对象之后。为什么仍然存在的问题

【问题讨论】:

    标签: nhibernate nhibernate-mapping


    【解决方案1】:

    我想知道您的级联是否导致了问题。你的整个图表上有 cascade=all 吗?如果是这样,您可能需要重新评估您的生命周期策略。

    这是来自 NHibernate 1.2 参考的第 9.9 节的内容(强调添加)

    映射关联(多对一, 或集合)与 cascade="all" 将关联标记为父/ 儿童风格关系在哪里 保存/更新/删除父级 导致保存/更新/删除 孩子们)。 此外,仅 从持久性引用一个孩子 父级将导致保存/更新 孩子

    【讨论】:

    • 但是为什么会这样呢?我没有改变任何东西,所以更新是为了什么?无论如何,我将其更改为 cascade=none 并且没有任何区别。感谢您的回复
    【解决方案2】:

    事实证明,ContactInfo 中的枚举字段是问题所在。我不介意那个特定的文件是一个字符串,所以改变它解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      相关资源
      最近更新 更多