sobota, 10 listopada 2012

JPA2/Hibenrate - MultipleBagFetchException

Opisywałem już jedną niespodziankę, jaką szykuje nam hibenrate jeśli używamy java.util.List zamiast java.util.Set. Niestety to nie jest jedyna niespodzianka :). Podczas pracy z hibenratem możemy nagle trafić na taki oto błąd:
org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
wynikający z chęci pobrania co najmniej dwóch kolekcji z jednej encji. Oczywiście błąd ten dotyczy sytuacji w której korzystamy z java.util.List. Wystarczy w takim razie zmienić naszą kolekcję na java.util.Set i problem zostanie rozwiązany.

Chciwe pobieranie - krótkie wyjaśnienie na czym polega
Chciwe pobieranie (EAGER) polega na wybraniu wszystkich potrzebnych danych od razu. Możemy to zrobić na dwa sposoby:
  • dodania do adnotacji @OneToMany, @ManyToMany, itd. fetch=FetchType.EAGER. Trzeba uważać na pobranie zbyt dużej ilości danych. Więcej o tym problemie tutaj. W takiej konfiguracji dostaniemy nasz błąd już podczas deployu aplikacji.
  • podczas tworzenia zapytania, określić które wiązania/relacje mają zostać chciwie dobrane poprzez oznaczenie ich jako FETCH. W takiej konfiguracji nasz błąd zostanie odkryty w momencie uruchomienia zapytania.