不幸的是,这种关系并不是在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