5

我有一个复合组件,它具有多对一的引用。

class MyComposite
{
    SomeEntity ManyToOne { get; set; }
    SomeOtherUserType Value { get; set; }
}

为了便于映射,我做了一个ICompositeUserType包含这个组件的自定义:

class MyCompositeUserType : ICompositeUserType
{
    // ...
    private static readonly IType[] _propertyTypes = new[]
                                   {
                                       new ManyToOneType("SomeEntity"), 
                                       new CustomType(typeof(SomeOtherUserType))
                                   };
    // ...
}

现在,我有一个composite-element包含此组件的 s 集合:

<class name="Container">
...
<set name="Pairings"
     cascade="all-delete-orphan"
     generic="true"
     lazy="false"
     table="Pairings"
     fetch="join">
    <key column="ContainerId" />
    <composite-element class="Pair">
        <property name="Item1" type="mycomposite" lazy="false">
            <column name="Entity1Id" />
            <column name="Amount1" />
        </property>
        <property name="Item2" type="mycomposite" lazy="false">
            <column name="Entity2Id" />
            <column name="Amount2" />
        </property>
        <property name="Tag" column="Tag" />
    </composite-element>
</set>
</class>

当我查询Container该类时,该Pairings集合按设计被急切地加载,但是,然后我得到一个N+1选择,SomeEntity它构成了MyCompositeUserType. 我想加载这些实体以及Pairings集合上的连接。

如何指定?

4

1 回答 1

0

如果映射为组件,您可以使用lazy="false" 将其多对一映射,或者应该可以在查询时设置fetchmode

<composite-element class="Pair">
    <component name="Item1">
        <many-to-one name="Entity1" column="Entity1Id" />
        <property name="Amount" column="Amount1" />
    </component>
    <component name="Item2">
        <many-to-one name="Entity2" column="Entity2Id"/>
        <property name="Amount" column="Amount2" />
    </component>
    <property name="Tag" column="Tag" />
</composite-element>
于 2012-05-17T17:59:38.397 回答