44
VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA Zbyněk Šlajchrt http://java.vse.cz/4it447/HomePage Část 8.

VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Embed Size (px)

DESCRIPTION

VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA. Zbyněk Šlajchrt http://java.vse.cz/4it447/HomePage. Část 8. Dědičnost entit. Základní vlastnost OOP Sdílení stavu a chování mezi třídami uspořádanými do hierarchií - PowerPoint PPT Presentation

Citation preview

Page 1: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKAZbyněk Šlajchrt http://java.vse.cz/4it447/HomePageČást 8.

Page 2: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Dědičnost entit

Základní vlastnost OOP Sdílení stavu a chování mezi třídami

uspořádanými do hierarchií Na rozdíl od relací nemají relační databáze

koncept pro dědičnost mezi tabulkami Lze zařídit dodatečně - 3 strategie

Single-table-per-hierarchy Joined-subclass Table-per-concrete-class

2

Page 3: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Příklad dědičnosti3

Page 4: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Příklad dědičnosti - Java4

Page 5: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Single-table-per-hierarchy

Tato strategie mapuje celou hierarchii tříd entit do jedné tabulky Jedna tabulka ITEM a v ní atributy pro Item,

Book a CD Default strategie Tabulka obsahuje speciální sloupec pro

rozlišení entit – tzv. discriminator column Lze konfigurovat pomocí @DiscriminatorColumn Hodnotu, kterou je identifikována entita ve

sloupci, lze určit pomocí @DiscriminatorValue umístěné na třídu

5

Page 6: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Single-table-per-hierarchy6

ID

DTYPE

TITLE PRICE

DESCRIPTION

MUSICCOMPANY

ISBN ...

1 Item Pen 1,20 Nice pen

2 CD ABBA 20,00 Remake EMI

3 Book Bible 1,00 God's book 1

4 CD Beatles

30,00 best of ... EMI

ITEMIDDTYPETITLEPRICEDESCRIPTIONMUSICCOMPANYISBNNUMBEROFPAGES...

ITEMIDDTYPETITLEPRICEDESCRIPTIONMUSICCOMPANYISBNNUMBEROFPAGES...

Page 7: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Single-table-per-hierarchy

Výhody Nejjednodušší – snadná správa Nejvýkonnější strategie – žádné joiny,

subselecty atd. Nevýhody

Sloupce potomků musí být NULLABLE – big problem!

Model není normalizovaný, jelikož sloupce patřící potomkům nemusí být používané

7

Page 8: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Joined-strategy

Tato strategie mapuje entity do samostatných tabulek

Tabulka entity obsahuje pouze sloupce pro atributy deklarované ve třídě entity

Zděděný stav se mapuje do tabulky předka Tabulka kořenové entity (Item) znovu

obsahuje discriminator column pro rozlišení řádek entit

Kořenovou entitu (Item) je třeba anotovat @Inheritance(strategy=Inheritance.JOINED)

8

Page 9: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Joined-strategy9

ITEMIDDTYPETITLEPRICEDESCRIPTION

ITEMIDDTYPETITLEPRICEDESCRIPTION

CDIDMUSICCOMPANYNUMBEROFCDSTOTALDURATIONGENDER

CDIDMUSICCOMPANYNUMBEROFCDSTOTALDURATIONGENDER

BOOKIDILLUSTRATIONSISBNNUMBEROFPAGESPUBLISHER

BOOKIDILLUSTRATIONSISBNNUMBEROFPAGESPUBLISHER

Page 10: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Joined-strategy

Výhody Vlastnosti potomků mohou být NOT NULL Model je normalizovaný

Nevýhody Není tak výkonná jako Single-table-per-

hierarchy

10

Page 11: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Single-per-concrete-class

Každá entita je mapovaná do vlastní tabulky včetně zděděných vlastností

Schéma není normalizované Sloupce z kořenové tabulky se opakují v

tabulkách potomků Není zde žádný discrimator column Primární klíč je sdílený – nesmí se vyskytovat

dvakrát napříč tabulkami v jedné hierarchii Nepovinná strategie ve specifikaci JPA 2.0

přenositelné aplikace by jej neměly používat

11

Page 12: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Single-per-concrete-class12

ITEMIDTITLEPRICEDESCRIPTION

ITEMIDTITLEPRICEDESCRIPTION

CDIDTITLEPRICEDESCRIPTIONMUSICCOMPANYNUMBEROFCDSTOTALDURATIONGENDER

CDIDTITLEPRICEDESCRIPTIONMUSICCOMPANYNUMBEROFCDSTOTALDURATIONGENDER

BOOKIDTITLEPRICEDESCRIPTIONILLUSTRATIONSISBNNUMBEROFPAGESPUBLISHER

BOOKIDTITLEPRICEDESCRIPTIONILLUSTRATIONSISBNNUMBEROFPAGESPUBLISHER

Page 13: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Single-per-concrete-class

Výhody Vlastnosti mohou být NOT NULL Může být jednodušší mapování na legacy schéma

Nevýhody Model není normalizovaný, opakování sloupců

předka Náročné na implementaci polymorfních dotazů

Buď více selectů do všech tabulek hierarchie – POMALÉ! Nebo pomocí SQL UNION – podporují pouze některé DB

Lépe se této strategii vyhýbat

13

Page 14: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Typy předků Entita

standardní entita Abstraktní entita

z hlediska JPA totéž jako entita Ne-entita

také se někdy označují jako tranzientní třídy vlastnosti zděděné z tohoto předka se nemapují do DB

Mapovaný předek Ne-entita, její vlastnosti se však mapují do tabulky

potomka – anotuje se @MappedSuperclass Podobnost s embedded entity

14

Page 15: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Dotazovací aparát

Doposud jsme probírali pouze vyhledávání podle primárního klíče EntityManager::find a

EntityManager::getReference JPA 2.0 obsahuje specifikaci jazyka JPQL Objektově-orientovaný dotazovací jazyk

inspirovaný SQL Vývojář při sestavování dotazu pracuje s

objekty nikoliv s prostými hodnotami Tečková notace pro přístup k vlastnostem entit Client.address.street

15

Page 16: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Query API

Dotaz se vytváří voláním metody createQuery na objektu EntityManager

Parametrem je výraz v syntaxi jazyka JPQL

Vrací objekt s rozhraním javax.persistence.Query

Metoda getSingleResult() vrací jediný objekt pokud není objekt právě jeden

Metoda getResults() vrací seznam – i prázdný

16

Page 17: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Parametrizovaný dotaz

Podobně jako v JDBC, i v JPQL lze dotazy parametrizovat

Parametry lze definovat jménem nebo pořadím Definice pojmenovaného parametru

na místo hodnoty ve výrazu se zapíše název parametru s prefixem :

na místo hodnoty ve výrazu se zapíše pořadové číslo parametru s prefixem ? indexováno od 1

Hodnota parametru se nastavuje setParameter()

17

Page 18: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Parametrizovaný dotaz18

Nastavení parametrů podle jejich pořadí:

Nastavení parametrů podle jejich názvu:

Page 19: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Časové parametry

Pro zadávání hodnot časových parametrů se používá jiných metod setParameter(name/position, Date, TemporalType) setParameter(name/position, Calendar,

TemporalType) TemporalType je výčtový typ, který specifikuje

databázový časový typ, do kterého se konvertuje typ java.util.Date nebo java.util.Calendar DATE TIME TIMESTAMP

19

Page 20: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Stránkování výsledků

V případě velkého počtu výsledků lze omezit jejich počet

Query::setFirstResult(index) Oznamuje dotazu, od kterého indexu má

vrátit první výsledek Query::setMaxResult(max)

Oznamuje dotazu maximální počet výsledků v seznamu

20

Page 21: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Hints

Někteří dodavatelé JPA poskytují extra funkcionalitu, kterou lze použít při dotazování Např. JBoss EJB 3.0 (obsahuje Hibernate)

umožňuje specifikovat timeout dotazu Pro nastavení extra funkcionality se volá

setHint(hintName, hintValue) query.setHint("org.hibernate.timeout",

1000);

21

Page 22: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

FlushMode dotazu

Ovlivňuje způsob synchronizace stavu entit s databází

Někdy se hodí, aby během zpracování dotazu platil jiný flush mod např. chceme zabránit, aby EntityManager

provedl automatický flush před dotazem – mod AUTO mu to umožňuje

Dočasný flush mod se nastavuje Query::setFlushMode(flushMode) query.setFlushMode(FlushModeType);

22

Page 23: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

JPQL SELECT

Klauzule SELECT slouží k definici výběru dat z databáze

Výsledkem může být entita atribut entity nově zkonstruovaný objekt hodnota agregační funkce sekvence výše uvedených výsledků

Pro odkazování na atributy entit se používá tečková konvence

23

Page 24: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

SELECT - Syntaxe24

SELECT <select expression>FROM <from clause>[WHERE <conditional expression>][ORDER BY <order by clause>][GROUP BY <group by clause>[HAVING <having clause>]]

Page 25: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

SELECT – Příklady

SELECT c FROM Customer c Vrací seznam všech zákazníků List<Customer>

SELECT c.firstName FROM Customer c Vrací seznam křestních jmen všech zákazníků List<String>

SELECT c.firstName, c.lastName FROM Customer c

Vrací seznam křestních jmen a příjmení (pole velikosti 2) List<Object[2]>

SELECT c.address FROM Customer c Vrací seznam adres všech zákazníků List<Address>

25

Page 26: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

SELECT – Příklady

SELECT c.address.country.code FROM Customer c

Ukázka tečkové notace. Vrací seznam kódů zemí v adresách zákazníků.

List<String>

SELECT NEW cz.vse.javaee.prednaska8.CustomerDTO (c.firstName, c.lastName, c.address.city) FROM Customer c

Vrací seznam objektů CustomerDTO vytvořených pro každého zákazníka. Do konstruktoru se předávají údaje zákazníka.

List<CustomerDTO>

26

Page 27: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

SELECT – Příklady

SELECT DISTINCT c.firstName FROM Customer c Vrací seznam křestních jmen všech zákazníků bez duplicit. List<String>

SELECT count(c) FROM Customer c Vrací skalární hodnotu rovnu počtu všech zákazníků. List<Long>, velikost 1, volat Query::getSingleResult()

Agregační funkce AVG - průměr COUNT - počet MAX - maximum MIN - minimum SUM - součet

27

Page 28: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Klauzule FROM

Definuje entity v dotazu Alias entity může být použit v dalších

klauzulích SELECT, WHERE, ...

Příklady: FROM Customer c FROM Customer AS c FROM Customer c, Account a FROM Customer c, IN(c.accounts) a

28

Page 29: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Klauzule WHERE

Definuje podmínkový výraz pro omezení výsledků používá se v SELECT, UPDATE, DELETE

Příklady: WHERE c.firstName='Josef' WHERE c.firstName='Josef' AND c.lastName='Novák' WHERE a.deposit NOT BETWEEN 1000 AND 100000 WHERE c.address.country IN ('CZ', 'SK') WHERE c.email LIKE '%vse.cz'

% - více-znakový wildcard _ - jednoznakový wildcard

29

Page 30: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Operátory ve WHERE

=, >, <, >=, <=, <>, [NOT] BETWEEN [NOT] LIKE [NOT] IN IS [NOT] NULL IS [NOT] EMPTY [NOT] MEMBER OF AND, OR

V Javě se druhý operand nevyhodnocuje, pokud hodnota prvního určuje výsledek

V JPQL se na toto nedá spolehnout

30

Page 31: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Subqueries

Vnořené dotazy se používají v klauzulích WHERE a HAVING

Příklady SELECT acc FROM Account acc WHERE acc.deposit=

(SELECT MAX(a.deposit) FROM Account a) Vybere účet s největším vkladem V podstatě dva nezávislé dotazy

SELECT c FROM Customer c WHERE 1000 > (SELECT SUM(a.deposit) FROM c.accounts AS a) Vybere klienty, kteří mají na svých účtech méně než

1000 Kč Vnořený dotaz je svázaný s hlavním dotazem

31

Page 32: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Subqueries – ALL, ANY, SOME Tyto operátory se používají pro vnořené

dotazy, které vracejí více řádek ALL – logická operace musí platit pro všechny

výsledky vnořeného dotazu ANY (SOME), - Operace musí platit aspoň pro

jeden výsledek vnořeného dotazu Příklad:

... FROM Client c WHERE 100 < ALL (SELECT a.deposit FROM c.accounts AS a) Vybere klienty, kteří mají na svých všech účtech více

než 100

32

Page 33: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Subqueries - EXISTS

Operátor EXISTS vrací true výsledek obsahuje jeden nebo více výsledků

Příklad: FROM Client c WHERE EXISTS (SELECT a

FROM c.accounts AS a WHERE a.deposit > 100) Vrací pouze ty klienty, kteří mají aspoň na

jednom účtu uloženo více jak 100 Kč

33

Page 34: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Klauzule ORDER BY

ORDER BY se používá k seřazení výsledků dotazu

Výsledky jsou seřazeny podle atributů entity uvedených v klauzuli

Uvádí se i směr seřazení – vzestupně ASC, sestupně DESC

Příklady: SELECT c FROM Customer c ORDER BY c.lastName,

c.firstName SELECT a FROM Account a ORDER BY a.deposit

DESC, a.client.lastName ASC, a.client.firstName ASC

34

Page 35: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Klauzule GROUP BY

GROUP BY se používá k seskupení entit Skupina je tvořena entitami, které mají stejnou

hodnotu atributů uvedených v GROUP BY Výsledek může obsahovat pouze skupinové

atributy (z GROUP BY) a hodnoty agregačních funkcí aplikovaných na ne-skupinové atributy entit.

Příklad: SELECT a.client, sum(a.deposit) FROM Account a

GROUP BY a.client Výsledek v seznamu je klient a součet vkladů na jeho

účtech

35

Page 36: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Klauzule HAVING

Používá se pro filtrování dotazů sestavených pomocí GROUP BY

Podmínku může obsahovat pouze agregační funkce nad atributy, které se vyskytují v klauzuli SELECT

Příklad: SELECT a.client, sum(a.deposit) FROM Account

a GROUP BY a.client HAVING sum(a.deposit) > 1000 Vybere klienty, kteří mají na svých účtech v

souhrnu vyšší částku než 1000 Kč

36

Page 37: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Příkaz DELETE

Určeno pro dávkové odstraňování entit Syntaxe:

DELETE FROM <entity_name> [[AS] <alias>] [WHERE <condition>]

Příklad: DELETE FROM Client AS c WHERE

c.firstName='Karel' Smaže všechny Karly

37

Page 38: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Příkaz UPDATE

Určeno pro dávkovou aktualizaci entit Syntaxe:

UPDATE <entity_name> [[AS] <alias>] SET <update_statement> {, <update_statement>}* [WHERE <condition>]

Příklad: UPDATE Account AS a SET

a.deposit=a.deposit*1.01 where a.client.firstName='Josef' Připíše 1% ze zůstatku všem Josefům

38

Page 39: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

INNER JOIN

V klauzulích není možné používat atributy-kolekce

Často je ale zapotřebí s nimi pracovat Operátor IN přiřazuje vybrané kolekci

alias lze pak s tímto alias pracovat, jako by to

byla entita Příklad:

SELECT a FROM Client c, IN(c.accounts) a Vrátí všechny účty patřící nějakým klientům

Alternativní zápis: SELECT a FROM Client c INNER JOIN

c.accounts a

39

Page 40: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

LEFT JOIN

LEFT JOIN umožňuje vybírat také entity, které nemají nastavenu požadovanou vazbu

Atributy protější entity mají ve výsledku hodnotu NULL

Příklad: SELECT c.firstName, c.lastName, p.number

FROM Client c LEFT JOIN c.phoneNumbers p

40

Josef Novák 656787377Josef Novák 746888333Karel Vodička 535288223Jan Malý NULL

Page 41: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Fetch Joins

Umožňuje nahrát asociované entity, i když má vazba nastaven FetchType jako LAZY

Příklad: MailBox – Messages (1:N)

SELECT mbox FROM MailBox mbox INNER JOIN FETCH mbox.messages

Bez FETCH bychom museli nahrát entity zpráv v Javě pomocí cyklu – problém s výkonností

41

Page 42: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Dodatek: JPQL Funkce

LOWER(String), UPPER(String) TRIM([[LEADING|TRAILING|BOTH]

[trimchar] FROM] String) CONCAT(String1, String2) LENGTH(String) LOCATE(String1, String2 [, start]) – hledá

řetězec SUBSTRING(String, start, length) ABS(number), SQRT(double), MOD(int, int)

42

Page 43: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Dodatek: JPQL Funkce

CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP

Agregační funkce: COUNT, MAX, MIN, AVG, SUM DISTINCT – eliminuje duplicity hodnoty null jsou automaticky eliminovány

43

Page 44: VÝVOJ PODNIKOVÝCH APLIKACÍ NA PLATFORMĚ JAVA - PŘEDNÁŠKA

Zdroje

Burke, Bill – Monson-Haefel, Richard; Enterprise Java Beans 3.0; O'Reilly

Goncalves, Antonio; Beginning Java EE 6 Platform With GlassFish 3; APRESS

44