[Javalist] Hibernate outer join

Király Péter kirunews at freemail.hu
2013. Okt. 22., K, 22:30:19 CEST


Sziasztok,

következő a problémám. Vannak felhasználók, akiknek lehetnek elmentett kereséseik, címkéik, kedvenceik, és API kulcsaik. Mind az öt egy-egy különálló osztály, hozzá tartozó táblázattal az adatbázisban, a user azonosítója köti őket a user objektumhoz. Az egész ügyet a Hibernate kezeli. Amikor egy-egy felhasználónak volt több tucat elmentett eze-aza, akkor ez egyes mentések elkezdtek lassulni. Némi nyomozás után kiderült, hogy amikor egy user objektumot lekérek, akkor a Hibernate outer join-nal összekapcsolja a táblákat és létrejön egy baromi nagy, redundáns taláati lista az adatbázisban (például 94 ez, 9 az, 14 amaz és 5 emez esetén 59 220 soros találati halmaz, ami sosornként tartalmazza az összes tábla összes oszlopát (némelyiket duplán is  -- 94 * 9 * 14 * 5 = 59 220). Egy Hibernate FAQ (https://community.jboss.org/wiki/HibernateFAQ-AdvancedProblems?_sscc=t#jive_content_id_Hibernate_does_not_return_distinct_results_for_a_query_with_outer_join_fetching_enabled_for_a_collection_even_if_I_use_the_distinct_keyword) azt mondja, hogy ez normális. Lehet ugyan trükközni a HQL-ben, de az nem az SQL-t fogja módosítani, hanem a találati halmazon a memóriában fog változatni. Ezt nem nagyon akarom elhinni. Hogy lehet az, hogy amikor mind a adatbázisban, mind a Java objektumok oldalán szépen normalizáljuk a dolgokat, a Hibernate nem egyesével kérdezi le a csatolt táblákat, hanem egy ilyen erőforráspazarló és lassú megoldást produkál? Azt remélem, hogy van valamilyen kapcsoló, amit én nem vettem észre. Merre induljak el, mit tanácsoltok?

Köszönettel,
Király Péter


További információk a(z) Javalist levelezőlistáról