Pozor museum: Toto je archivní verze blogu. Pro vkládání komentářů přejděte na tento článek v nové verzi blogu.

Ukázka ORM – Hibernate JPA

Objektové programování a relační databáze, to jsou dva dost odlišné světy. K jejich propojení můžeme použít objektově relační mapování (ORM). Ne vždy je to nejlepší cesta a rozhodně to není cesta jediná, ale když už čtete tuhle stránku, předpokládám, že víte, do čeho jdete :-) V dnešním článku se podíváme na jednoduchý příklad použití ORM v podání aplikačního serveru Glassfish a Hibernate (použijeme ho jako poskytovatele JPA).

Co bude cílem

Abych předešel vašemu zklamání, prozradím už na začátku, co bude výsledkem našeho snažení: zobrazit na webové stránce záznamy z jedné tabulky v databázi.

Možná je to hodně triviální, ale jak známo: „Aby se dosáhlo velkého, je třeba začít s menším.“ Nebudeme teď řešit žádné optimalizace, žádné spojování tabulek, žádné ukládání dat – pouze zobrazení. Než se data dostanou k uživateli, projdou několika vrstvami:

Databáze → Hibernate JPA → EJB → Webová beana → JSP

Příprava GlassFishe (v2)

Do aplikačního serveru potřebujeme dostat podporu Hibernatu – do /opt/glassfish/lib (upravte si podle toho, kde máte GlassFish nainstalovaný) nahrajeme tyto knihovny:

antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
ejb3-persistence.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate-entitymanager.jar
hibernate3.jar
javassist-3.4.GA.jar
jta-1.1.jar
log4j.jar
slf4j-api-1.5.2.jar
slf4j-log4j12.jar

Tyto knihovny nemusíte shánět po všech čertech, stačí si stáhnout Hibernate Core a Hibernate EntityManager. A aplikační server restartujeme. Teď máme v našem GlassFishi vedle TopLinku také Hibernate (dva poskytovatele JPA).

Příprava databáze

V databázi (používám PostgreSQL) pořtebujeme jedinou tabulku, kterou zobrazíme na webu. Tuto tabulku jsem si vypůjčil ze svého programu HříšníciSpameři (info). Zjednodušený skript na vytvoření tabulky najdete v sql/schéma.sql. Tabulka obsahuje tři sloupečky: id, název, url a jmenuje se cil. Na webové stránce budeme zobrazovat seznam těchto cílů (odkazy).

V aplikačním serveru si vytvoříme datový zdroj a dáme mu JNDI jméno jdbc/HrisniciSpameri.  Toto jméno si samozřejmě můžete změnit dle libosti, ale nezapomeňte pak provést úpravu i v souboru persistence.xml, který se na něj odkazuje.

Aplikace HibernateDemo1

Zdrojové kódy tohoto příkaldu najdete v mém mercurialu: HibernateDemo1 (jak to stáhnout?). Aplikace je tvořena několika netbeansovskými projekty:

  • HibernateDemo1 – „enterprise“ aplikace, zastřešuje ten zbytek
  • HibernateDemo1-ejb – Velmi primitivní EJB vrstva, obsahuje jedinou komponentu, která je zároveň DAO. Toto je jediná vrstva, ve které pracujeme s JPA (Hibernate).
  • HibernateDemo1-lib – společné knihovny, obsahuje rozhraní CilDAORemote (abychom mohli volat EJB z webové vrstvy) a přepravku Cil.
  • HibernateDemo1-war – webová vrstva, obsahuje jednoduché JSP a webovou beanu, která zprostředkuje volání EJB.

Po otevření v Netbeans si budete muset nastavit deployování na váš aplikační server a asi trochu upravit knihovny (HibernateDemo1-lib závisí na JavaEE: javaee.jar – kvůli anotacím).

Z hlediska ORM jsou pro nás zajímavé tyto soubory:

  • persistence.xml – nastavení persistentní jednotky.
  • *.hbm.xml – popistují mapování tříd na tabulky.

Persistence.xml

Velice důležitý soubor, nastavujeme zde:

  • Název persistentní jednotky: v našem případě HibernateDemo1-PU – na tento název se potom odkazujeme v aplikaci: @PersistenceContext(). Obvykle máme v aplikaci právě jednu persistentní jednotku.
  • Poskytovatel JPA: v našem případě org.hibernate.ejb.HibernatePersistence. Alternativou je TopLink (konkurence).
  • Datový zdroj: JNDI jméno, v našem případě jdbc/HrisniciSpameri
  • Parametry pro daného JPA poskytovatele. Důležitý je hibernate.dialect – Hibernate potřebuje vědět, jaký SŘBD je pod ním, aby dokázal správně formulovat SQL dotazy. Vlastnost hibernate.show_sql můžeme nastavit na true, pokud chceme v logu vidět SQL dotazy, které Hibernate provádí – hodí se pro ladění, jinak ale dáme false, aby nám nezahltil logy. Popis všech parametrů najdeme v dokumentaci.

*.hbm.xml

V těchto souborech popisujeme vlastní mapování mezi tabulkami v databázi a třídami v Javě.  Toto mapování můžeme popsat i pomocí anotací přímo ve zdrojáku třídy. Zda zvolit to či ono, se dá diskutovat, já jsem si vybral XML. Kromě toho, že XML je prostě bezva :-) se nám nebudou rozlézat závislosti na anotačních třídách do vrstev, ve kterých nás nezajímají, naše přepravkové třídy zůstanou čisté. Rovněž je to pružnější řešení než anotace přímo v kódu.

EntityManager

S daty pracujeme pomocí „entitního manažera“ – použití vidíte ve třídě CilDAOBean. K psaní dotazů zde nepoužíváme klasické SQL, ale EJB-QL.

Výsledek

Do tabulky v DB si nezapomeňte vložit pár záznamů, aby se mělo co zobrazovat. Pokud se všechno povedlo, uvidíte něco takového: HibernateDemo1 (pouze IPv6). Ty tři odkazy jsou načtené z databáze – to je vše – jen ukázka.

Průměr: 2.4 (5 hlasů)

Glassfish V3

Pokud máte novější Glassfish (verze 3), už nemusíte ručně kopírovat knihovny – jednoduše si Hibernate doinstalujete přes „updaty“ ve webovém rozhraní aplikačního serveru ;-)

Nekuřák.net

Doufám, že čtete i můj seriál na Zdrojáku, kde vyvíjím webovou aplikaci nekurak.net. Používá se v ní Hibernate ORM, EJB a další skvělé věci.

Spring JdbcTemplate

Vyzkoušejte si i novější demo Spring JdbcTemplate. Sice to není ORM ale jen pomůcka usnadňující práci s JDBC, ale přesto (nebo právě proto) se vám může hodit.