Hibernate Exception: Simultaneously Fetch Multiple Bags
February 14th, 2008
Při vývoji aplikace, na které právě v práci
vyšívám, jsem narazil na zajímavou vyjímku Hibernate Exception:
Simultaneously Fetch Multiple Bags.
Tato vyjímka nastane ve třídě org.hibernate.loader.BasicLoader v případě, kdy v entitě nastavím více jak jedné property EAGER strategii načítání, přičemž property musí být typu „Bag“ (tedy List nebo Collection).
Obyčejně pro všechny perzistentní kolekce používám typ Set, ale v tomto případě jsem se rozhodl použít List (kvůli přímé možnosti indexace prvků) a současně jsem označil více takovýchto listů jako EAGER. Přesně v tomto případě problém vznikne.
Důvod tohoto chování Hibernate je dobře popsán např. zde. Na této stránce jsou také popsány 3 typy řešení:
- zachovat kolekce typu Bag (List nebo Collection) a současně použít Hibernate proprietární anotaci @IndexColumn
- zachovat kolekce typu Bag (List nebo Collection) a současně použít LAZY fetch strategii místo EAGER
- upustit od Bagu a používat výhradně Set
Já jsem se přiklonil k řešení č. 3, tedy upustil jsem i v tomto konkrétním případě od použití Listů a nahradil jsem je standardními Sety. V algoritmu pracujícím se záznamy kolekce si mohu přece vždy vytvořit List pomocí kopírovacího konstruktoru některé z implementací a přístup přes indexy provádět nad tímto novým objektem.

Dobra rada.
delalo mi to preblem hlavne, kdyz se nacitalo k entite List a k polozkam Listu dalsi Listy.