如何避免“N + 1选择”并指定具有多对一的(N)Hibernate用户类型的获取策略?

时间:2012-04-28 02:00:10

标签: hibernate nhibernate nhibernate-mapping

我有一个复合组件,它具有多对一参考。

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集合:     

<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 选择1}}构成SomeEntity的一部分。我想在MyCompositeUserType集上加载这些实体和连接。

如何指定?

1 个答案:

答案 0 :(得分: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>
相关问题