[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