2012-04-28 7 views
5

Tengo un componente compuesto que tiene una referencia muchos a uno.¿Cómo evito una "selección N + 1" y especifico una estrategia de búsqueda para (N) tipo de usuario Hibernación que tiene muchos a uno?

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

Para facilitar la asignación, he hecho una costumbre ICompositeUserType cuales encompases este componente:

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

Ahora, tengo una colección de composite-element s que incluyen este componente:

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

Cuando consulto en la clase Container, el conjunto Pairings se carga con entusiasmo, como diseño ed, sin embargo, luego obtengo un N + 1 seleccione en el SomeEntity que forma parte del MyCompositeUserType. Quiero cargar esas entidades junto con la combinación en el conjunto Pairings.

¿Cómo se puede especificar esto?

+0

¿Qué código se está utilizando para consultar? ¿Estás especificando un Fetch para cargar las entidades relacionadas? Si es así, ¿está utilizando un transformador para eliminar los elementos raíz duplicados? – cdmdotnet

+0

No se extraen extracciones en la consulta. Es solo una lista ToList. – codekaizen

+0

¿Existe alguna razón por la que necesite 'ICompositeUserType' en lugar del mapeo' '? – Firo

Respuesta

0

si asignada como componente puede asignar como muchos a uno con lazy = "false" o debería ser posible para establecer el fetchMode al consultar

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