2012-02-09 38 views
1

的數據方案是這樣的:

項目:

  • INT ID(PK)
  • 字符串名稱
  • INT StorageId(FK寄存,非唯一用法)

 

存儲(在映射忽略):

  • INT ID(PK)
    • 字符串名稱

 

TransporterToStorage(包含信息,不僅鏈接表):

  • INT ID(PK)
    • INT StorageId(FK存儲)
    • INT TransporterId(FK轉運)
    • string TransportLineName

 

轉運(在映射忽略):

  • INT ID(PK)
    • 字符串名稱

項目應該用C#/ NHibernate類表示,並且包含0-n個條目的附加集合屬性TransportersToStorage。由於性能方面的原因,我只想將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,但標準究竟做了):

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

可以在許多一對多或類似的關聯,只有一個完成加入發送到該SQL數據庫?

什麼是最好映射這個?

默認情況下(意思是:根本沒有)懶惰地加載子集合,並在給定的情況下急切地加載子集合。

+0

你能解決這個問題嗎? – 2012-11-09 13:25:41

+0

我放棄了,因爲我正在使用的應用程序幾乎不使用NHibernate對象關係,幾乎不可能在很短的時間內重構它。目前,大多數對象的設計與上面的「Item」類似,只有另一個對象的ID,頂層通過單獨的查詢(以前是原生SQL,越來越多的HQL/Criteria)安排所有加載,相關對象更新,集合等。在不久的將來,改變這可能成爲一項任務。 – 2012-11-09 17:54:02

回答

0

我懷疑會議管理問題在這裏,我懷疑你的會話是關閉的,在你訪問你的懶惰/渴望加載的孩子。您可能需要更改管理會話的方式,或將父/子加載到DTO中,然後從您的方法中返回。

不知道更多關於處理會話的方式,更難以確定的答案。