不幸的是,這種關係並不是在nHibernate中建模最簡單的事情,並且在嘗試對鏈接表中的數據執行查詢時會遇到一些固有問題,這需要一些複雜的解決方法,但是一旦得到它設置得很好。
我的方法是將其設置爲兩個多對一的映射,其中存儲映射中的以下關係和StockItem映射中的反向關係。
<bag name="StockItems" table="StockItemStore" lazy="true">
<key column="StoreId" />
<composite-element class="SuperStore.Components.StockItemStore, SuperStore.Components">
<property name="ParLevel" type="Int32" />
<many-to-one name="StockItem" column="StockItemId" class="SuperStore.Components.StockItem, SuperStore.Components" fetch="join" cascade="all" />
</composite-element>
</bag>
的存儲類將具有以下集合:
public virtual IList< StockItemStore > StockItems {get;set;}
和StockItem將再次逆:
public virtual IList< StockItemStore > Stores {get;set;}
的StockItemStore對象可以包含任何對象(Store或StockItem)以及鏈接表中的任何其他信息。(在這種情況下只是ParLevel)
取決於您在StoreItem或StockItem中查看StockItemStore對象的哪一側將爲空,它可以分解爲兩個類,但我覺得這種方法更容易處理。它只是需要你作爲開發人員知道哪些方面你是從接近它,但它是一個很好的折衷爲使代碼更簡單,更可重複使用在我看來
public class StockItemStore
{
private StockItem stockItem;
private Store store;
public virtual StockItem StockItem
{
get
{
if (stockItem == null)
{
stockItem = new StockItem();
}
return stockItem;
}
set
{
stockItem = value;
}
}
public virtual Store store
{
get
{
if (store == null)
{
store = new Store();
}
return store;
}
set
{
store = value;
}
}
public virtual int ParLevel { get; set; }
}
我的方法不使用單一的唯一標識符在你的問題中定義的StockItemStore中,而是在鏈接表中相當於一個複合關鍵字,但它在過去總體上對我很好,我相信你可以在s o如果你真的需要它。
這種方法適用於使用HQL進行查詢。如果您正在嘗試使用ICriteria查詢,它往往會變得有點過分。有一些解決方案使用數據庫視圖模擬另一個表來用於查詢已爲我工作。
如果你需要做ICriteria查詢讓我知道,我可以張貼一些示例代碼。
我忘了提,我刪除了它的StockItemStore類的代碼示例簡單,但你應該*總*實現equals和GetHashCode在NHibernate的對象 – 2009-05-06 19:37:09