Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

Podobné dokumenty
Object-relational mapping (JPA, Hibernate)

DPKOM_06 Dědičnost entit a zpětná volání posluchači

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

Anotace a Hibernate. Aleš Nosek Ondřej Vadinský Daniel Krátký

KIV/PIA 2013 Jan Tichava

Úvod do programovacích jazyků (Java)

DJ2 rekurze v SQL. slajdy k přednášce NDBI001. Jaroslav Pokorný

typová konverze typová inference

Úvod do databázových systémů

Tvorba informačních systémů

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

UJO Framework. revoluční architektura beans. verze

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programování v Javě I. Leden 2008

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Přizpůsobení JSTL pro Google App Engine Datastore

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Úvod do databázových systémů

Ing. Bc. Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Návrh schématu DB

Programování v Javě I. Únor 2009

Principy objektově orientovaného programování

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

20. Projekt Domácí mediotéka

Databázové systémy. Datová integrita + základy relační algebry. 4.přednáška

Tvorba informačních systémů

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Objektově relační databáze a ORACLE 8

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava

Seminář Java IV p.1/38

KMI / TMA Tvorba mobilních aplikací. 6. seminář ZS 2016/2017 Středa 13:15-15:45

Teoretické minimum z PJV

Enterprise Java Beans 3.0

OBJECT DEFINITION LANGUAGE. Jonáš Klimeš NDBI001 Dotazovací Jazyky I 2013

8.2 Používání a tvorba databází

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Dolování v objektových datech. Ivana Rudolfová

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Dědění, polymorfismus

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Výčtový typ strana 67

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.

1. Programování proti rozhraní

Michal Krátký, Miroslav Beneš

Operátory ROLLUP a CUBE

Oracle XML DB. Tomáš Nykodým

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Generické programování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek

DPKOM_7 Dotazy a EJB QL

Zápisování dat do databáze

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Typický prvek kolekce pro české řazení

Databázové systémy. Cvičení 6: SQL

4IT218 Databáze. 4IT218 Databáze

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Inovace a zkvalitnění výuky prostřednictvím ICT. Základní seznámení s MySQL Ing. Kotásek Jaroslav

Technologie JavaBeans

Ukládání a vyhledávání XML dat

KIV/ZIS cvičení 6. Tomáš Potužák

Jazyk C# - přístup k datům

Abstraktní datové typy: zásobník

Datové struktury. alg12 1

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Tabulka fotbalové ligy

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Dotazování v relačním modelu a SQL

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

1. Dědičnost a polymorfismus

Seminář Java II p.1/43

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Základy informatiky. 08 Databázové systémy. Daniela Szturcová

SQL v14. 4D Developer konference. 4D Developer conference 2015 Prague, CZ Celebrating 30 years

6. blok část C Množinové operátory

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června krovacek@students.zcu.cz

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Databáze v Java aplikacích, JPA Handout

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 26.3.

Java - řazení objektů

Programování v C++ 1, 5. cvičení

Použití databází na Webu

Úvod do databázových systémů

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

RELAČNÍ DATABÁZOVÉ SYSTÉMY

SQL SQL-SELECT. Informační a znalostní systémy. Informační a znalostní systémy SQL- SELECT

Databázové systémy II. KIV/DB2 LS 2007/2008. Zadání semestrální práce

STARÁ DOBRÁ JAVA A PERSISTENCE S CACHÉ

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Základy informatiky. 06 Databázové systémy. Kačmařík/Szturcová/Děrgel/Rapant

Nasazení Object Relation Mapping nástrojů nad legacy datovým modelem

Michal Krátký. Tvorba informačních systémů, 2008/2009. Katedra informatiky VŠB Technická univerzita Ostrava. Tvorba informačních systémů

Transkript:

Platforma Java Objektově relační mapování II Petr Krajča Katedra informatiky Univerzita Palackého v Olomouci Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, 2016 1 / 15

Dotazování vyhledání objektu podle kĺıče (resp. průchod grafem objektů) ad-hoc dotazy (JPQL) pojmenované dotazy (JPQL) Criteria API () nativní dotazy (SQL) Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, 2016 2 / 15

Dotazování Vyhledání podle kĺıče em.find(stockitem.class, value); Ad-hoc dotazy Query q = em.createquery("select item from Invoice item"); List<Invoice> invoices = q.getresultlist(); Ad-hoc dotazy s parametry Query q = em.createquery("select cust from Customer cust where" + " cust.itin = :itin"); q.setparameter("itin", value); return q.getsingleresult(); Nikdy nelepte parametry do dotazu pomocí spojení řetězců! Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, 2016 3 / 15

Pojmenované dotazy obdoba prepared statements @NamedQuery( name = "allinvoicesforcustomer", query = "select i from Invoice i where i.customer = :cust") public class Invoice implements Serializable { /*... */ Vyvolání dotazu Query q = em.createnamedquery("allinvoicesforcustomer") q.setparameter("cust", customer) List<Invoice> invoices = q.getresultlist() Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, 2016 4 / 15

Pojmenované dotazy Více pojmenovaných dotazů pro jednu entitu @NamedQueries({ @NamedQuery( name = "allinvoices", query = "select i from Invoice i"), @NamedQuery( name = "allinvoicesforcustomer", query = "select i from Invoice i where i.customer = :cust"), @NamedQuery( name = "allinvoicesforcustomeritin", query = "select i from Invoice i where i.customer.itin = :custitin") ) @Entity public class Invoice implements Serializable { /*... */ Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, 2016 5 / 15

Aktualizace dat s JPQL vhodné pro hromadné aktualizace Query q = em.createquery("update StockItem it SET" + " it.unitprice = it.unitprice * 1.1"); int updated = q.executeupdate(); Query q = em.createquery("delete FROM StockItem it" + " WHERE it.itemname :name"); q.setparameter("name",...); int updated = q.executeupdate(); Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, 2016 6 / 15

Pokročilé dotazy s JPQL rozsah operací podobný jako v SQL možné vrátit obecný tuple jako Object[] List<Object[]> res = em.createquery("select c.name, COUNT(inv.id)" + " FROM Customer c, Invoice inv" + " WHERE inv.customer = c " + " GROUP BY c.name").getresultlist(); Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, 2016 7 / 15

Criteria API typově bezpečné podpora dynamické tvorby dotazů meta-model vygenerované třídy s příponou _, např. Foo_ pro entitu Foo CriteriaBuilder třída sestavující dotaz CriteriaQuery třída představující dotaz (je potřeba převést na běžný dotaz EntityManageru) CriteriaBuilder cb = em.getcriteriabuilder(); CriteriaQuery cq = cb.createquery(invoice.class); Root<Invoice> invoice = cq.from(invoice.class); cq.select(invoice); TypedQuery<Invoice> q = em.createquery(cq); List<Invoice> invoices = q.getresultlist(); Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, 2016 8 / 15

Criteria API Root<Invoice> invoice = cq.from(invoice.class); cq.where(cb.equal(invoice.get(invoice_.customer), customer)); cq.select(invoice); cb.equal operace porovnaní Invoice_.customer odkaz na atribut v meta-modelu Aktualizace CriteriaBuilder update = entitymanager.getcriteriabuilder(); CriteriaUpdate<StockItem> cq = update.createcriteriaupdate(stockitem.class); Root<StockItem> item = cq.from(stockitem.class); cq.set(stockitem_.unitprice, update.prod(item.get(stockitem_.unitprice), new BigDecimal(2))); Query q = entitymanager.createquery(cq); q.executeupdate(); Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, 2016 9 / 15

Dědičnost anotace @Inheritance nesoulad rel. modelu a objekt. modelu tři možnosti SINGLE TABLE jedna tabulka pro celou hierarchii jeden sloupec pro rozlišení jednotlivých tříd atributy, které nejsou v dané třídě definovány nastaveny na NULL potenciální problémy chybějící sloupec určující třídy atributům v podtřídě nelze nastavit NOT NULL Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, 2016 10 / 15

@Entity @Inheritance @DiscriminatorColumn(name="INVOICE_TYPE") @ForceDiscriminator public abstract class Invoice { @Id private long id; /*... */ @Entity @DiscriminatorValue("NAT") public class NationalInvoice extends Invoice { private String eetno; @Entity @DiscriminatorValue("INT") public class InternationalInvoice extends Invoice { private String iban;

Dědičnost JOINED každa tabulka obsahuje atributy v ní definované potomci a jejich tabulky musí obsahovat atribut primární kĺıč který je definovaný v kořenové třídě přirozený způsob reprezentace některé implementace JPA (ne)vyžadují sloupec určující typ třídy Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, 2016 12 / 15

@Entity @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name="INVOICE_TYPE") @ForceDiscriminator public abstract class Invoice { @Id private long id; /*... */ @Entity @DiscriminatorValue("NAT") @Table(name = "INVOICE_NAT") public class NationalInvoice extends Invoice { private String eetno; @Entity @DiscriminatorValue("INT") @Table(name = "INVOICE_INT") public class InternationalInvoice extends Invoice { private String iban;

Dědičnost TABLE PER CLASS pro každou třídu existuje jedna tabulka každá tabulka obsahuje všechny atributy včetně atributů předka pomalé dotazy (vícenásobné dotazy nebo UNIONy) problematická spojení a řazení záznamů @MappedSuperclass podobný přístup jako TABLE_PER_CLASS nevyskytuje se v datovém modelu, nelze ji odkazovat každý potomek má vlastní třídu Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, 2016 14 / 15

@Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) public abstract class Invoice { @Id private long id; /*... */ @Entity @Table(name = "INVOICE_NAT") public class NationalInvoice extends Invoice { private String eetno; @Entity @Table(name = "INVOICE_INT") public class InternationalInvoice extends Invoice { private String iban; Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, 2016 15 / 15