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.Basic­Loader 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.

4 Responses to “Hibernate Exception: Simultaneously Fetch Multiple Bags”

Lenka

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

benzin

No jenze kromne toho ze List umoznuje duplicitni prvky, kdezto Set ne. Tak navic List kolekce s urcenym poradim prvku, kdezto Set nikoli.

Sice je mozne ze pro tu kterou konkretni implementaci Set plati, ze se jedna o kolekci s urcenym poradim, ale to neni patrne z rozhrani. Takze kdyz pak nekdo dokolekce neco prida, muze se poradi rozhazet. To nikdo nemuze vedet predem, jak se to zachova.

Takze bych to rekl takhle. Prirozene se nejen ze jedna o Set (jedinecnost prvku), ale taky o List (poradi prvku). Bohuzel rozhrani, ktere by davalo oboji tyto vlastnosti nemame, takze je potreba uzit to co ma v danou chvili vyssi prioritu.

benzin

Btw. osobne se spise klonim k List, protoze je rychlejsi a ve vetsine pripadu duplicita prvku nehrozi (nebo ji osetruji jinak).

Marlon

What theme is this? Can't wait to start my own blog.

Leave a Reply