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řepravkuCil
. - 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. Vlastnosthibernate.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.
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.