渴望获取引用时重复(多对一)

use*_*648 6 nhibernate hql nhibernate-mapping fluent-nhibernate fluent-nhibernate-mapping

首先,是的,我正在使用DistinctRootEntityResultTransformer.

我有以下(Fluent 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");
}
Run Code Online (Sandbox Code Playgroud)

注意,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>();
Run Code Online (Sandbox Code Playgroud)

为了测试,我在数据库中有1个FirstObject,1个SecondObject,1个ThirdObject和24个FourthObjects.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)
Run Code Online (Sandbox Code Playgroud)

因此无论出于何种原因,NH都会创建24个SecondObject而不是1个.

我猜它不知道如何将"join fetch"(左或内部似乎无关紧要)映射到Reference(SecondObject中对ThirdObject的引用).

我有什么选择?我无法更改数据模型,但我确实需要将其全部加载.

提前致谢!

Rip*_*ppo 4

仅当加载父实体和子实体时,不同的根实体才有效。对于孙子和曾孙来说,这是行不通的。问题是您正在加载多个集合关联并返回一个大的cartesian product

请阅读Ayende 的这篇文章,其中解释了为什么会出现这种情况以及解决方法。

一些可能不会立即显现出来的东西将导致笛卡尔积。文档中指出了这一点,但我认为我们都同意,虽然这种行为可能有原因,但它远非理想。