Duplikaty, gdy chętni pobierają referencje (wiele do jednego)
Po pierwsze, tak, używam DistinctRootEntityResultTransformer.
Mam następujące mapowanie (Fluent NHibernate):
<code>public FirstObjectMap() { Id(x => x.Id): HasMany<SecondObject>(x => x.SecondItems).KeyColumn("FirstObject_ID"); } public SecondObjectMap() { Id(x => x.Id).Column("ID"); References(x => x.ThirdObject).Column("ThirdObject_ID"); } public ThirdObjectMap() { Id(x => x.Id).Column("ID"); HasMany<D>(x => x.FourthItems).KeyColumn("ThirdObject_ID"); } public FourthObjectMap() { Id(x => x.Id).Column("ID"); } </code>
Zauważ, że SecondObject odnosi się do ThirdObject (co oznacza, że klucz znajduje się na SecondObject).
Moje zapytanie wygląda tak:
<code>var query = session.CreateQuery("select distinct first from " + "FirstObject as first " + "left join fetch first.SecondItems as second " + "left join fetch second.ThirdObject as third " + "left join fetch third.FourthItems as four where ..."); // This is not even needed as I'm using distinct in HQL query.SetResultTransformer(new DistinctRootEntityResultTransformer()); var results = query.List<ReinsurableObject>(); </code>
Do testowania mam 1 bazę FirstObject, 1 SecondObject, 1 ThirdObject i 24 FourthObject. Zapytanie SQL zwraca 24 wiersze zgodnie z oczekiwaniami.
Jednak oto haczyk: NHibernate tworzy:
<code>1 FirstObject 24 SecondObject (should be 1) 24 x 1 ThirdObject (should be 1) 24 x 1 x 24 FourthObject (should be 24) </code>
Więc NH z jakiegokolwiek powodu tworzy 24 SecondObject zamiast 1.
Zgaduję, że nie wie, jak zmapować „join fetch” (lewe lub wewnętrzne nie ma znaczenia) na Reference (odniesienie do ThirdObject w SecondObject).
Jakie mam opcje? Nie mogę zmienić modelu danych, ale muszę go załadować.
Z góry dziękuję!