【问题标题】:NHibernate non-unique child collection to load eagerly (one-to-many or many-to-many)NHibernate 非唯一子集合急切加载(一对多或多对多)
【发布时间】:2012-02-09 16:20:24
【问题描述】:
  • 当我使用一对多关系时,我不断得到:

    集合不与任何会话关联

    急切加载时出错,如果我延迟加载,则不会得到任何子节点。

  • 当使用多对多时,我得到了不必要的错误连接。

数据方案是这样的:

项目:

  • int ID (PK)
  • 字符串名称
  • int StorageId(FK 存储,非唯一用法)

 

存储(在映射中忽略):

  • int ID (PK)
    • 字符串名称

 

TransporterToStorage(包含信息,不仅仅是链接表):

  • int ID (PK)
    • int StorageId(FK 存储)
    • int TransporterId (FK Transporter)
    • 字符串 TransportLineName

 

Transporter(在映射中忽略):

  • int ID (PK)
    • 字符串名称

项目应由 C# / NHibernate 类表示,具有附加的集合属性TransportersToStorage,包含 0-n 个条目。由于性能原因,我只想将 Item.StorageId 映射到 TransporterToStorage.StorageId 并忽略 Storage 表,该表包含两者的主键。

<bag name="TransportersToStorages" ... >
<key property-ref="StorageId" unique="false" ... />
<one-to-many class="TransporterToStorage" column="StorageId" ... />
</bag>

一对多似乎违反了一些 NHibernate 规则,因为相等的 TransporterToStorage 条目可以属于多个项目。这可能是以下原因:

集合不与任何会话关联

急切加载时出错。

具体查询是这样的(快速伪HQL,但实际上是用Criteria完成的):

select Item inner join fetch TransporterToStorage tts 
where tts.TransporterId = :p1 and tts.StorageId in (:p2, :p3, :p4)

可以通过发送到数据库的 SQL 中的一个联接来完成多对多或类似的关联吗?

什么是最好的映射?

默认情况下,子集合应该延迟加载(意思是:根本不加载),并且在给定的情况下急切地加载。

【问题讨论】:

  • 你能解决这个问题吗?
  • 我放弃了,因为我正在使用的应用程序很少使用 NHibernate 对象关系,而且几乎不可能在短时间内全部重构。目前,大多数对象的设计类似于上面的“项目”,只有另一个对象的 ID,并且顶层通过单独的查询(以前是原生 SQL,越来越多的 HQL/Criteria)安排所有加载、相关对象的更新、集合等。在不远的将来改变这一点可能成为一项任务。

标签: nhibernate join many-to-many one-to-many eager-loading


【解决方案1】:

我怀疑这里存在会话管理问题,我怀疑您的会话在您访问您的懒惰/急切加载的孩子之前已关闭。您可能需要更改管理会话的方式或将父/子加载到 DTO 并从您的方法中返回它。

如果不了解更多关于您处理会话的方式的信息,很难得到更明确的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多