我有一个三级的实体层次结构: Customer-Order-Line,我希望使用ISession.Get(id)为给定的客户检索它。我有以下XML片段:
customer.hbm.xml:
<bag name="Orders" cascade="all-delete-orphan" inverse="false" fetch="join">
<key column="CustomerID" />
<one-to-many class="Order" />
</bag>order.hbm.xml:
<bag name="Lines" cascade="all-delete-orphan" inverse="false" fetch="join">
<key column="OrderID" />
<one-to-many class="Line" />
</bag>我使用了fetch="join“属性来指示我想要获取每个父实体的子实体,这已经构造了正确的SQL:
SELECT
customer0_.ID AS ID8_2_,
customer0_.Name AS Name8_2_,
orders1_.CustomerID AS CustomerID__4_,
orders1_.ID AS ID4_,
orders1_.ID AS ID9_0_,
orders1_.PostalAddress AS PostalAd2_9_0_,
orders1_.OrderDate AS OrderDate9_0_,
lines2_.OrderID AS OrderID__5_,
lines2_.ID AS ID5_,
lines2_.ID AS ID10_1_,
lines2_.[LineNo] AS column2_10_1_,
lines2_.Quantity AS Quantity10_1_,
lines2_.ProductID AS ProductID10_1_
FROM Customer customer0_
LEFT JOIN [Order] orders1_
ON customer0_.ID=orders1_.CustomerID
LEFT JOIN Line lines2_
ON orders1_.ID=lines2_.OrderID
WHERE customer0_.ID=1到目前为止,这看起来还不错- SQL返回了正确的一组记录(只有一个不同的orderid),但是当我运行一个测试来确认Orders和Lines的正确实体数量(来自NH)时,我得到了错误的结果
我应该得到(从我的测试数据),1xOrder和4xLine,然而,我得到了4xOrder和4xLine。似乎NH没有识别结果集中的“重复”订单信息组,也没有正确地“重用”订单实体。
我使用的是全整数ID (PKs),并且我已经尝试使用这个ID实现T的IComparable和T的IEquatable,希望NH会看到这些实体是相等的。我也尝试过重写Equals和GetHashCode来使用ID,但这两个“尝试”都没有成功。
NH是否支持“多级获取”操作?如果是,是否需要XML设置(或其他机制)来支持它?
注:我使用了sirocco的解决方案,并对我自己的代码做了一些修改,最终解决了这个问题。对于所有的集合,需要从一个包到另一个集合更改xml,并且实体本身也被更改以实现IComparable<>,这是要建立唯一性的集合的要求。
public class BaseEntity : IComparable<BaseEntity>
{
...
private Guid _internalID { get; set; }
public virtual Guid ID { get; set; }
public BaseEntity()
{
_internalID = Guid.NewGuid();
}
#region IComparable<BaseEntity> Members
public int CompareTo( BaseEntity other )
{
if ( ID == Guid.Empty || other.ID == Guid.Empty )
return _internalID.CompareTo( other._internalID );
return ID.CompareTo( other.ID );
}
#endregion
...
}请注意InternalID字段的用法。这对于新的(瞬态)实体是必需的,否则它们最初不会有ID (我的模型在保存时会提供ID)。
发布于 2008-12-02 21:23:47
@Tigraine:您的查询只返回带有注释的帖子。这将带来所有帖子和所有评论(2个级别)。本要求的是客户订购到LineItem (3级)。@Ben:据我所知,nHibernate目前还不支持快速加载到3级。Hibernate确实支持它。
https://stackoverflow.com/questions/332703
复制相似问题