重复时渴望获取基准(多到一个)(Duplicates when eager fetching a r

2019-06-23 23:28发布

首先,是的,我使用DistinctRootEntityResultTransformer。

我有以下的(功能NHibernate)映射:

public FirstObjectMap() 
{
    Id(x => x.Id):
    HasMany<SecondObject>(x => x.SecondItems).KeyColumn("FirstObject_ID");
}

public SecondObjectMap()
{
    Id(x => x.Id).Column("ID");
    References(x => x.ThirdObject).Column("ThirdObject_ID");
}

public ThirdObjectMap()
{
    Id(x => x.Id).Column("ID");
    HasMany<D>(x => x.FourthItems).KeyColumn("ThirdObject_ID");
}

public FourthObjectMap()
{
    Id(x => x.Id).Column("ID");
}

请注意,这SecondObject指ThirdObject(意味着关键是SecondObject)。

我的查询如下所示:

var query = session.CreateQuery("select distinct first from " + 
   "FirstObject as first " +
   "left join fetch first.SecondItems as second " +
   "left join fetch second.ThirdObject as third " + 
   "left join fetch third.FourthItems as four where ...");

// This is not even needed as I'm using distinct in HQL
query.SetResultTransformer(new DistinctRootEntityResultTransformer());

var results = query.List<ReinsurableObject>();

为了测试,我有1 FirstObject,1 SecondObject,1 ThirdObject和数据库24个FourthObjects。 作为espected的SQL查询返回24行。

然而,这里的渔获:NHibernate的创建:

1 FirstObject
  24 SecondObject (should be 1)
     24 x 1 ThirdObject (should be 1)
         24 x 1 x 24 FourthObject (should be 24)

所以NH不管是什么原因造成的24 SecondObject而不是1。

我猜它不知道如何映射“连接抓取”(左或内似乎并不重要),参考(在SecondObject引用ThirdObject)。

我有哪些选择? 我不能改变的数据模型,但我确实需要急于负荷这一切。

提前致谢!

Answer 1:

如果您加载父母和孩子不同的根实体才有效。 对于孙子和曾孙这不起作用。 问题是要装入多个集合关联并返回一个大cartesian product

请阅读此文章由Ayende这就解释了为什么这种情况和解决方法。

东西可能不会马上明显会导致笛卡尔积。 这指出了在文档 ,但我认为,我们都同意,虽然有可能是这种行为的原因,这是很不理想。



文章来源: Duplicates when eager fetching a reference (many-to-one)