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ć?
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
Brak dodatkowych przydziałów w zapytaniu. To tylko prosta ToList. – codekaizen
jest powód, dla którego potrzebujesz 'ICompositeUserType' zamiast' 'mapowania? –
Firo