25. září 2008

Proč JPA, když mi stačí Hibernate?

Většinu projektů jsem v minulosti realizovat pomocí "čistého" Hibernatu (Hibernate Core). Na posledním projektu jsem byl nucen přejít na Hibernate Entity Manager resp. JPA z důvodu použití nástroje JBoss Envers na verzování. Sice to byl pádný důvod proč přejít na JPA, ale pokud bych tento důvod neměl, tak jina žádný důvod pro přechod k JPA nemám, spíše naopak.

Než si začnu stěžovat, tak ještě musím uvést, že píši v kontextu lightweight aplikací. Při použití EJB resp. aplikačních serverů je to zcela jiné, tam vidím velký význam a přínos ve standardizaci rozhraní datové vrstvy.

Zde jsou některé mé stížnosti:

  • JPA toho zdaleka neumí tolik co samotný Hibernate (viz list of all Hibernate extension annotations nebo Hibernate Annotation Extensions).

  • Na předchozí bod je možné namítnout, že mi nic nebrání, abych tyto rozšíření používal. To je pravda, ale proč pak nepoužít přímo Hibernate? Jedna z uváděných vlastností JPA je ta, že je možné vyměnit ORM engine pokud se budu držet JPA specifikace. Má to vůbec smysl? Občas potřebuji vyměnit databázi, ale nevím, kdy bych potřeboval vyměnit ORM engine.

  • Nedávno jsem řešil problém s ukládáním souborů (BLOB objektů) do databáze. Spring nabízí jako vždy pomoc - třída AbstractLobType a její implementace (hezký popis je na tomto blogu). Zde je ovšem podmínkou konfigurovat Hibernate pomocí LocalSessionFactoryBean, tedy používat "čistý" Hibernate Core.

  • Konfigurace Hibernatu přes JPA je trochu přes ruku. Většina věcí se musí konfigurovat přes properties v persistence.xml. Je ale pravda, že nyní (všimnul jsem si toho až v poslední verzi 3.4 Entity Manageru) je možné používat JPA a konfigurovat Hibernate přes standardní hibernate.cfg.xml soubor, viz hibernate.ejb.cfgfile property.

  • Stejnou výtku jako v předešlém bodě mohu mít ke psaní JPQL dotazů. Samotný JPQL sice vychází z HQL, ale takové možnosti nemá. Mohu zase používat HQL, mohu využívat Session, nativní JDBC dotazy, ale vše je to přímočařejší s Hibernate bez JPA.

1 komentář:

Václav Tunka řekl(a)...

Zajímavé zamyšlení, ale myslím si, že se vyplatí používat JPA i tehdy, pokud budu používat rozšíření Hibernate.

Případná migrace bude o to jednodušší. Doladí se pouze věci, které přidává daný ORM navíc.

Může se například stát, že se použitý ORM přestane vyvíjet a co pak? Teď mluvím hlavně o komerčních implementacích. Pak člověk musí takový nástroj hackovat, protože je většinou úzce provázaný s business logikou aplikace a neexistuje jednoduchá cesta pro změnu. Člověk si potom řekne proč jsem jen nepoužil JPA...