Kurz ORM: Porovnání verzí
Z FI WIKI
(New page: 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)...) |
|||
(Není zobrazeno 6 mezilehlých verzí od 4 dalších uživatelů.) | |||
Řádka 22: | Řádka 22: | ||
=== Nevýhody ORM === | === Nevýhody ORM === | ||
* Potenciálně menší výkon (ORM nástroj má jistou režii) | * 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í | + | * 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. | + | * 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 === | === Problémy ORM === | ||
Řá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 101: | Řádka 102: | ||
=== Mapování entit na relační schéma === | === Mapování entit na relační schéma === | ||
* jak říci, že je položka tranzientní | * jak říci, že je položka tranzientní | ||
− | * | + | * mapování základních typů |
* primitivní versus objektové typy (null) | * primitivní versus objektové typy (null) | ||
* mapování časových údajů | * mapování časových údajů | ||
Řádka 109: | Řádka 110: | ||
* LOBy | * LOBy | ||
* vztahy | * vztahy | ||
− | * pokročilejší problémy (reprezentace dědičnosti, | + | * pokročilejší problémy (reprezentace dědičnosti, embeddable objekty, ...) |
=== 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 | + | * 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 =
- 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
- EJB, Servlety
- dependency injection
- transakce řízené kontejnerem
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