Kurz ORM: Porovnání verzí

Z FI WIKI
Přejít na: navigace, hledání
m (Mapování entit na relační schéma: kosmeticke zmeny)
 
(Nejsou zobrazeny 3 mezilehlé verze od 2 dalších uživatelů.)
Řádka 40: Řádka 40:
 
== Základní principy ===
 
== Základní principy ===
 
* Dva základní přístupy
 
* Dva základní přístupy
** POJO Entity
+
** [[POJO]] Entity
** Entity EJB (dnes již na ústupu)
+
** Entity [[EJB]] (dnes již na ústupu)
  
 
* Způsob transformace mezi objektovým a relačním modelem může být definován
 
* Způsob transformace mezi objektovým a relačním modelem může být definován
Řádka 53: Řádka 53:
 
* Nástroje umožňují generovat db schéma z ORM mapování, nebo naopak ORM mapování z DB schématu
 
* Nástroje umožňují generovat db schéma z ORM mapování, nebo naopak ORM mapování z DB schématu
  
== Java Persistence API ===
+
== Java Persistence API ==
 
* Viz [[Java Persistence API]]
 
* Viz [[Java Persistence API]]
 
* Standard pro zajištění perzistence dat prostřednictvím objektově relačního mapování ([[ORM]]).  
 
* Standard pro zajištění perzistence dat prostřednictvím objektově relačního mapování ([[ORM]]).  
Řádka 61: Řádka 61:
 
** Hibernate
 
** Hibernate
 
** Toplink Essential
 
** 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í
 
* 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
 
* Výhodou je velké množství kvalitní dokumentace
Řádka 69: Řádka 70:
 
* Začaly se používat [[DTO]] a [[DAO]].
 
* Začaly se používat [[DTO]] a [[DAO]].
 
* Vznikl [[Hibernate]].
 
* Vznikl [[Hibernate]].
* Ten byl pak velkou inspirací pro JPA.
+
* 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).
 
* 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).
  
Řádka 112: Řádka 113:
  
 
=== Dotazování ===
 
=== Dotazování ===
* Java Persistence QL
+
* [[JPQL|Java Persistence QL]]
  
 
=== Transakce ===
 
=== Transakce ===
Řádka 121: Řádka 122:
 
=== JPA a Java EE komponenty ===
 
=== JPA a Java EE komponenty ===
 
* EJB, Servlety
 
* EJB, Servlety
* dependency injection
+
* [[dependency injection]]
* transakce řízené kontejnerem
+
* transakce řízené [[kontejner|kontejnerem]]
  
 
== Tipy na závěr ==
 
== Tipy na závěr ==
Řádka 128: Řádka 129:
 
* 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ů, ...)
 
* 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
 
* Anotace versus deskriptory
* Entity a DTO objekty;  
+
* Entity a [[DTO]] objekty;  
 
* Správná granularita entit, žádná business logika
 
* 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)
 
* 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
 
* Správně zacházet s výjimkami
 +
* Best practices k vazbám
 
* Vztah k data binding
 
* Vztah k data binding
  
 
[[Kategorie:Java EE]]
 
[[Kategorie:Java EE]]

Aktuální verze z 13. 5. 2013, 19:10

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