2012-04-28 30 views
5

我有一個複合組件,它具有多對一的參考。如何避免「N + 1選擇」並指定具有多對一的(N)Hibernate用戶類型的獲取策略?

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

爲了便於測繪的,我做了一個自定義的ICompositeUserType其encompases這個組件:

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集被急切加載,因爲設計但是,然後,我在SomeEntity上選擇了一個N + 1,它構成MyCompositeUserType的一部分。我想要在Pairings集合上加載這些實體以及連接。

這怎麼指定?

+0

當它映射到一個或它應該是可以設置fetchmode?你是否指定了一個Fetch來加載相關的實體?如果是的話,那麼你使用轉換器來刪除重複的根元素? – cdmdotnet 2012-05-01 21:30:52

+0

對查詢沒有多餘的提取。這僅僅是一個ToList。 – codekaizen 2012-05-01 21:42:27

+0

是否有原因需要'ICompositeUserType'而不是''映射? – Firo 2012-05-08 09:01:09

回答

0

如果映射爲組件,您可以儘可能多的懶=「假」您使用的查詢代碼什麼查詢

<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>