14. ledna 2009

ORM mých snů - iBatis 3

Všechny velké zajímavé projekty aplikací, na kterých jsem se podílel jako ORM používali Hibernate. Přiznám se, že jsem byl tímto frameworkem zpočátku nadšen. Pak moje nadšení trochu ochablo, ale verze 3 zase přinesla vylepšení, která jsem kvitoval (především z hlediska mapování).

Postupem času, ale čím dál tím víc cítím, že Hibernate (a v podstatě jakýkoliv JPA framework) není to pravé ořechové. Proč?

Nelíbí se mi, že je velmi těžké se z DataTypu dostat na connection, což je potřeba např. pro uložení XML do DB přes datový typ SQLXML, který je nutno vytvářet pomocí metody createSQLXML objectu Connection. O tom, že tuto instanci musím po provedení dotazu zase uvolnit pomocí její metody free ani nemluvě.

Dále se mi nelíbí, že nemám plně pod kontrolou SQL dotazy (jsou generovány z HQL), tj. případná optimalizace dotazů není úplně triviální. Samozřejmě je možné si vyžádat od Hibernate spojení a provést dotaz ručně, ale metoda connection objektu Session je deprecated, tak nevím jak to bude v Hibernate 4.

Šíleně mě začíná obtěžovat cache natažených objektů, Session. Pokud provádím nějaké batchové operace, které manipulují s velkým množstvím objektů (desetisíce), pak je problém jak to celé výkonově optimalizovat. Je nutné průběžně dělat commit, session vyclearovat a znova zaasociovat všechny objekty, které budu potřebovat. Nejen je to pracné, ale velmi často dohledávám původce nějaké LazyInitializationException.

Ale co jiného, co lepšího. Vždy jsem pokukoval po iBatisu. Zkoušel jsem jej, ale něco mi vždy řeklo, že to nějak s Hibernate zmáknu (přeci jenom ten framework znám a málo co mě při práci s ním překvapí). Ale návrh na verzi 3, který se mi dostal pod ruku mě nadchl. Proč?

Šíleně se mi zalíbila myšlenka definice rozhraní, které se zove Mapper, ale de facto je to DAO. Implementaci vytvoří iBatis sám. Např:

public interface EmployeeMapper {
Employee getEmployee (int employeeId);
List listAllEmployees();
}
Navíc se případné anotace, jak mapovat budou umísťovat do tohoto rozhraní a ne do modelu (jsem absolutním nepřítelem anotování modelu anotacemi pro DAO vrstvu).

Dále se mi zalíbila představa generování dynamických SQL dotazů pomocí DSL v Javě. Obávám se, že to není správný přístup. SQL by mělo být mimo aplikaci, takže v XML. Ale myšlenka je to jistě zajímavá.

Teď už nezbývá nic jiného než se těšit jak to celé dopadne.

10 komentářů:

Peter's Java Blog řekl(a)...

Na projektech jsem měl možnost vyzkoušet jak Hibernate tak iBatis (v tomto pořadí). S Hibernate jsme jen bojovali - dávkové operace je jen jeden příklad. Pro komplikovanější HQL dotazy (i jeden subselect, katrézský součin, skoro nulová podpora funkcí) generoval SQL dotazy, které nebyli úplně optimální pro naše potřeby. Sice jsme mohli použít přímo native SQL - ale to už Hibernate nepotřebuji vůbec.

O to více mě překvapilo, že s iBatisem nebyl vůbec žádné probém. Jednoduché DAO dotazy jsme si psali sami, komplikované nám dodávali databázisti předpřipravené a hotovo - hlavně žádná lazy inicializace, plná podpora všech nestandardních věcí (oraclovských).

Osobně si myslím, že JPA jako koncept je slepá ulička.

Honza Novotný řekl(a)...

Koukám, že je nás víc, kdo je zastáncem iBatisu. A všichni máme shodné (špatné) zkušenosti s Hibernatem.

O roadmapě a návrzích pro iBatis 3.0 už vím poměrně dlouho a těším se na ně.

Trochu mě ovšem trápí otázka, jestli iBatis 3.0 vůbec někdy bude. Jestli sis pročetl komentáře a poslední změny v dokumentu spadají někdy do poloviny minulého roku a většina aktivity se odehrála ještě dřív. Od posledního relase iBatisu už je to taky půl roku.

Doufám, že vývoj neusnul a pokračuje dál.

Jira řekl(a)...

Honza Novotný> Hele ty jsi četl můj příspěvek ještě před tím, než jsem jej zpublikoval ne? Moje poslední věta byla, že dokument je starší a že nikde není žádná aktivita, tak je otázka zda to bude.

Ale nakonec jsem našel commit diggest, kde nějaké commity ohledně verze 3 jsou, takže jsem to smazal a najel na optimismus.

Ale že JPA, Hibernate a podobné věci je slepá ulička, k tomuto závěru pomalu spěju taky ...

Honza Novotný řekl(a)...

Zdá se, že máme podobné myšlenkové postupy, které vedou k podobným závěrům a obavám ;-) . Snad to dopadne dobře a trojka brzy vyjde.

Petr Jůza řekl(a)...

Nejsem "bojovník" za Hibernate, ale nemyslím si, že JPA je slepá ulička. Použití každého řešení (knihovny) je vhodné na určitou množinu problémů a pokud je to něco jiného, tak už to pak "drhne". Mě by třeba asi ani nenapadlo dělat dávkové operace nebo složité dotazy pro reporty přes Hibernate.

Primárně tedy píši persistentní vrstvu pomocí Hibernatu a když je potřeba, tak sáhnu po JDBC. Souhlasím s myšlenkou, že Hibernate přidává další složitost do aplikace ve srovnání s JDBC resp. iBatisem, ale na druhou stranu je Hibernate celkem populární, takže není problém cokoliv najít, vyřešit.

Na závěr bych si dovolil malé přirovnání - s EJB je také spousta negativních zkušeností, ale nikdo asi neřekne, že je to "slepá ulička", protože některé věci se prostě bez EJB udělat nedají nebo dají, ale velice špatně. Zase na druhou stranu nemá cenu EJB používat na "jednoduché" věci. Je prostě potřeba používat vhodné nástroje na vhodné problémy. :)

Anonymní řekl(a)...

Zkuste se podivat na OpenJPA. Prijde mi o dost jednodussi a technicky vyspelejsi nez Hibernate.

veselej řekl(a)...

Podle mě je Hibernate poměrně slušný ORM "nástroj". Ovšem jde zásadně o místo použití. Na náročné dotazy se nehodí. Na ty jednoduché (kterých je podmě mě většina) je naprosto ok. Složitější věci radši řeším přes uložené procedury a popř. složitější dotazy přes view. Ale možná na iBatis taky mrknu.

Anonymní řekl(a)...

Co takhle (nez prejdete na iBatis) zkusit nejakou objektovou databazi - ono to jde i uplne bez mapovani, usetri se tim spousta prace. Opravdu potrebujete Oracle a SQL ?

Jira řekl(a)...

Každý ORM má tu skvělou vlastnost, že jeho integrace s jiným není jednoduchá (samozřejmě jde volat uložené procedury a SQL dotazy), ale pokud budu chtít objekt jednou natáhnout Hibernate, podruhé např. iBatisem, nedejbože budu potřebovat jejich integraci, pak to jistě nebude úplně jednoduché.

Co se objektové databáze týče, pak je to jistě velmi zajímavá volba, ale:
- jak je to s vývojem schématu?
- jak je to s databází velikou desítky GB?
- jak je to s klastrování (fail safe)?
A bohužel je to nové paradigma, takže důvěra je menší...

Anonymní řekl(a)...

Mne sa najskor nepacilo na IBatise, mnozstvo pisania XML configurakov pri vytvarani beznej CRUD aplikacie, ale od kedy som sa naucil pouzivat ABator, nemozem si IBatis vynachvalit.
Mate niekdo skusenost s novym IBatorom? Zatial som snim nepracoval.