2012-04-28 6 views
5

Mam składnik kompozytowy, który ma odniesienia wiele do jednego.Jak uniknąć "wyboru N + 1" i określić strategię pobierania dla (N) użytkownika w trybie hibernacji, który ma wiele do jednego?

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

Dla ułatwienia mapowania, zrobiłem zwyczaj ICompositeUserType który encompases ten składnik:

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

Teraz mam kolekcję composite-element s, które zawierają ten składnik:

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

Podczas zapytania w klasie Container zestaw Pairings jest ładowany z niecierpliwością, ponieważ projekt ed, jednak otrzymuję wtedy N + 1 wybrać na SomeEntity, który stanowi część MyCompositeUserType. Chcę załadować te elementy wraz z łączeniem w zestawie Pairings.

Jak można to określić?

+0

Jaki kod używasz do kwerendy? Czy określasz pobranie, aby załadować powiązane podmioty? jeśli tak, to czy używasz transformatora do usunięcia zduplikowanych elementów root? – cdmdotnet

+0

Brak dodatkowych przydziałów w zapytaniu. To tylko prosta ToList. – codekaizen

+0

jest powód, dla którego potrzebujesz 'ICompositeUserType' zamiast' 'mapowania? – Firo

Odpowiedz

0

jeśli odwzorowane jako składnik można mapować go aż do jednego z leniwy = „false” lub powinno być możliwe, aby ustawić fetchmode podczas odpytywania

<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> 
Powiązane problemy