Kurz ORM

Z FI WIKI
Přejít na: navigace, hledání

Tato stránka obsahuje kostru šestihodinového kurzu zaměřeného na ORM nástroje a zejména Java Persistence API

Úvod do ORM

  • Objektově-relační mapování (ORM) [1] je technika, která zajišťuje konverzi dat mezi objektovým a relačním datovým modelem.
  • Aplikace tak může ukládat data v relační databázi, ale na aplikační úrovni pracovat s objektovým modelem dat.
  • K čemu je to dobré?

Jak zajistit perzistenci dat

  • Viz vrstva persistence dat
  • Nejčastěji se používají relační databáze. Proč?
  • Proč použít objektový model?

Výhody ORM

  • Možnost pracovat s objektovým modelem.
  • Přenositelnost aplikací mezi různými databázovými systémy.
  • Typová kontrola v době překladu aplikace.
  • Eliminuje potenciální chyby v SQL, které se projeví až za běhu aplikace (to řeší i embedded SQL).
  • Usnadňuje testování
  • Často zjednodušuje a zpřehledňuje implementaci
  • Efektivnější vývoj (automatické doplňování názvů metod u entit, snazší přístup k dokumentaci JavaDoc, apod.)

Nevýhody ORM

  • Potenciálně menší výkon (ORM nástroj má jistou režii)
  • Nemožnost využití výhod relačního modelu a všech možností relačních databází na aplikační úrovni (např. uložené procedury).
  • Obvykle se pro přístup do databáze používá jeden společný účet (zejména v kombinaci s technikou connection pooling), takže není možné řídit oprávnění k přístupu na úrovni databáze.

Problémy ORM

  • Na první pohled by se mohlo zdát, že se jedná o nepříliš složitý problém (jeden objekt <-> jedna entita).
  • Ve skutečnosti je zde celá řada komplikací, které je nutné nějak řešit.
    • nejednoznačnost
    • různé typy vztahů
    • kompozice, agregace
    • dědičnost
  • rdb ukládá skalární hodnoty organizované do tabulek (čili relací)
  • objektový model pracuje s objekty a různými typy vazeb

Viz též http://en.wikipedia.org/wiki/Object-Relational_impedance_mismatch.

Základní principy =

  • Dva základní přístupy
    • POJO Entity
    • Entity EJB (dnes již na ústupu)
  • Způsob transformace mezi objektovým a relačním modelem může být definován
    • Pomocí externího souboru (obvykle ve formátu XML)
    • Pomocí speciálních JavaDoc komentářů (v době, kdy nebyly anotace, viz XDoclet)
    • Pomocí anotací
  • Výhodou anotací je větší přehlednost, neboť definice objektového modelu i jeho mapování je na jednom místě. To zjednodušuje vývoj a usnadňuje údržbu.
  • Výhodou externího souboru je nezávislost kódu entit na konkrétní technologii zajišťující ORM a také možnost měnit mapování bez nutnosti modifikovat kód.
  • Nástroje umožňují generovat db schéma z ORM mapování, nebo naopak ORM mapování z DB schématu

Java Persistence API

  • Viz Java Persistence API
  • Standard pro zajištění perzistence dat prostřednictvím objektově relačního mapování (ORM).
  • Definován prostřednictvím specifikace Enterprise JavaBeans 3.0 (JCP 220 [2]).
  • Lze jej však použít zcela nezávisle na EJB
  • Jedná se o rozhraní, které implementují různé ORM nástroje od různých dodavatelů
    • Hibernate
    • Toplink Essential
    • OpenJPA
  • Obsahuje základní funkce, jednotlivé implementace mohou prostřednictvím svého proprietárního rozhraní poskytovat řadu dalších služeb a možností
  • Výhodou je velké množství kvalitní dokumentace

Historie

  • Původně se v EJB používaly Entity EJB (snaha o transparentnost).
  • Bylo to zbytečně složité, problémy s výkonem a škálovatelností.
  • Začaly se používat DTO a DAO.
  • Vznikl Hibernate.
  • Ten byl pak velkou inspirací pro JPA.
  • JPA se nesnaží se být transparentní (není dobrý nápad možné problémy skrývat, ale je nutné dát vývojáři kontrolu).

Úvod do JPA

  • Jednotlivé doménové objekty jsou reprezentovány pomocí tzv. entit.
  • Entita je klasický POJO, tj. jednduchý a obyčejný objekt
  • Entita má atributy, které reprezentují vlastnosti doménového objektu.
  • Atributy jsou přístupné pomocí get/set metod.
  • Entita musí mít bezparamentrický konstruktor a pokud má být používána k přenosu dat prostřednictvím RMI, musí být serializovatelná.
  • Způsob uložení entity do relační databáze je definován pomocí anotací, nebo pomocí XML souboru.

První tutoriál

Konfigurace

  • Mapování může být definováno pomocí anotací nebo XML souboru.
  • Configuration by exception
  • Definice základních parametrů je v souboru persistence.xml. Tento soubor obsahuje jednu nebo více tzv. Persistence Unit.
  • Persistence Unit obsahuje:
    • Definici způsobu připojení k databázi (u aplikací běžících v kontejneru prostřednictvím JNDI, u samostatných aplikací jako url, jméno a heslo)
    • Způsob řízení transakcí
    • Způsob generování tabulek při spuštění aplikace
    • Seznam entit, které jsou danou Persistence Unit spravovány
    • a případné další parametry
  • EntityManagerFactory
  • EntityManager
  • Životní cyklus entity (managed, detached, apod.)

Mapování entit na relační schéma

  • jak říci, že je položka tranzientní
  • mapování základních typů
  • primitivní versus objektové typy (null)
  • mapování časových údajů
  • primární klíče - generování, typy, best practices
  • mapování výčtového typu
  • Lazy fetching
  • LOBy
  • vztahy
  • pokročilejší problémy (reprezentace dědičnosti, embeddable objekty, ...)

Dotazování

Transakce

  • Řízení pomocí JPA
  • Řízení pomoci JTA
  • správně zacházet s vyjímkami

JPA a Java EE komponenty

Tipy na závěr

  • Kdy použít a kdy nepoužít ORM; jaké jsou alternativy (JDBC, RowSet, objektové databáze, commons-dbutils)
  • nevýhody JPA ve srovnání s proprietárními API jednotlivých ORM nástrojů; co JPA neumí (uživatelsky definované mapování objektových typů, ...)
  • Anotace versus deskriptory
  • Entity a DTO objekty;
  • Správná granularita entit, žádná business logika
  • Kdy je lepší generovat schéma (tj. DDL soubor) z ORM mapování a kdy je to lepší naopak (lepší definice referenční integrity na úrovni SQL)
  • Správně zacházet s výjimkami
  • Best practices k vazbám
  • Vztah k data binding