Databáze v Java aplikacích, JPA Handout

Podobné dokumenty
Jalapeño: pekelně ostrá Java persistence v Caché. Daniel Kutáč Senior Sales Engineer

4. lekce Přístup k databázi z vyššího programovacího jazyka

Databázový systém označuje soubor programových prostředků, které umožňují přístup k datům uloženým v databázi.

Spring Framework Handout

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

Semináˇr Java X JDBC Semináˇr Java X p.1/25

STARÁ DOBRÁ JAVA A PERSISTENCE S CACHÉ

Úvod do Entity Frameworku

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

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

5. POČÍTAČOVÉ CVIČENÍ

O Apache Derby detailněji. Hynek Mlnařík

1 Tabulky Příklad 3 Access 2010

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

Úvod. Petr Aubrecht (CA) Martin Ptáček (Wincor Nixdorf) Je 10 typů lidí: ti, kteří znají binární kód, a ti, kteří ne.

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

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

C# - Databáze úvod, ADO.NET. Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí

Semináˇr Java X J2EE Semináˇr Java X p.1/23

Testovací metoda. Testovací metoda. public class SimpleTest {

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

KIV/PIA 2013 Jan Tichava

Inovace a zkvalitnění výuky prostřednictvím ICT Databázové systémy MySQL základní pojmy, motivace Ing. Kotásek Jaroslav

Synchronizace CRM ESO9 a MS Exchange

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata

Implementace dávkových operací

Instalace. Produkt je odzkoušen pro MS SQL server 2008 a Windows XP a Windows 7. Pro jiné verze SQL server a Windows nebyl testován.

Vhodnost nasazení jednotlivých webových architektur, sdílení dat, perzistence, webové služby a REST, asynchronnost, messaging

Databázové systémy. Doc.Ing.Miloš Koch,CSc.

A5M33IZS Informační a znalostní systémy. O čem předmět bude? Úvod do problematiky databázových systémů

Programování v jazyku C# II. 5.kapitola

Použití PostgreSQL v. P2D Martin Swiech

Téma 8: Konfigurace počítačů se systémem Windows 7 IV

TÉMATICKÝ OKRUH Softwarové inženýrství

Nástroje a frameworky pro automatizovaný vývoj. Jaroslav Žáček jaroslav.zacek@osu.cz

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

Primární klíč, cizí klíč, referenční integrita, pravidla normalizace, relace

Zabezpečení webové vrstvy a EJB projektu Část nastavení specifická pro Glassfish, část dána Java EE

Excel a externí data KAPITOLA 2

Databázové systémy Cvičení 5.2

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

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

APS Web Panel. Rozšiřující webový modul pro APS Administrator. Webové rozhraní pro vybrané funkce programového balíku APS Administrator

Jak správně na Hibernate. Martin Hlavatý

Databázové a informační systémy

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

Databázové systémy úvod

Jazyk SQL databáze SQLite. připravil ing. petr polách

Přihlášení Přihlaste na server: a zvolte přihlášení jako Charles University Prague: Medical students, employees and graduates.

4D Mobile! Úvod! Achitektura 4D Mobile!

ČSOB Business Connector instalační příručka

Typ 2 - připojení prostřednictvím kódu nativního klienta pro přístup k síti

ŠKOLENÍ PROGRAMOVACÍHO JAZYKA JAVA JAVA - ZÁKLADY

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

Úvod do databázových systémů. Ing. Jan Šudřich

Zápisování dat do databáze

Téma 1: Práce s Desktop. Téma 1: Práce s Desktop

Databáze I. Přednáška 4

JAVA EE ORGANIZÉR - SOFTWAROVÁ ARCHITEKTURA

PA165: Úvod do Java EE. Petr Adámek

Použití databází na Webu

PA165: Persistence Layer. Petr Adámek

Možnosti tisku v MarushkaDesignu

Obsah přednášky. Databázové systémy RDBMS. Fáze návrhu RDBMS. Coddových 12 pravidel. Coddových 12 pravidel

Relační databáze. V dnešní době existuje řada komerčních DBMS, nejznámější jsou:

Django. Webový framework pro Python Projekt = webová stránka Aplikace = určitá funkcionalita webu

(Enterprise) JavaBeans. Lekce 7

Vladimír

Použití dynamických parametrů prostředí SET_ENV_ v MarushkaDesignu

Unity a Objekty (NMIN102) RNDr. Michal Žemlička, Ph.D.

Technology Entry form Entry up-to-date? Internal links Faulty internal Possible internal links

Business Intelligence

EVIDENCE DOCHÁZKY SE ČTEČKOU INTAGRAL. příručka uživatele

Stručný úvod pro programátory. Michal Kuchta

UNIVERZITA PARDUBICE. Fakulta elektrotechniky a informatiky. Online galerie: využití J2EE s JPA Petr Bludský

ČSOB Business Connector Instalační příručka

Databáze I. 5. přednáška. Helena Palovská

typová konverze typová inference

Informační systémy ve zdravotnictví. 6. cvičení

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

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

Jazz Server osobní nastavení uživatele

Úvod do MS Access. Modelování v řízení. Ing. Petr Kalčev

Kapitola 1: Úvod. Systém pro správu databáze (Database Management Systém DBMS) Účel databázových systémů

Databázové systémy a SQL

TÉMATICKÝ OKRUH TZD, DIS a TIS

Výčtový typ strana 67

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

Implementace LMS MOODLE. na Windows 2003 Server a IIS 6.0

M4 PDF rozšíření. Modul pro PrestaShop.

Aplikace pro srovna ní cen povinne ho ruc ení

Django Urls, views, templates

Architektury informačních systémů

Databáze II. 1. přednáška. Helena Palovská

Architektury informačních systémů

Další vlastnosti Springu Moduly Springu. Spring Framework. Pavel Mička. Pavel Mička Spring Framework 1/18

Analýza dat a modelování. Přednáška 3

1.13 ACCESS popis programu

FIREMNÍ CERTIFIKÁT V APLIKACI PŘÍMÝ KANÁL NÁVOD PRO KLIENTY

Transkript:

Databáze v Java aplikacích, JPA Handout Martin Ledvinka martin.ledvinka@fel.cvut.cz 11. listopadu 2015 1 Přístup k databázím v Javě Jednou z mnoha výhod (a občas nevýhodou) platformy Java je její zaměření na standardizovanost, která umožňuje bezbolestně měnit poskytovatele služeb díky jednotnému rozhraní (teoreticky, v praxi to tak ne vždy funguje). Stejná situace je i u přístupu k databázím. Databázový přístup v Javě je řešen ve dvou hlavních standardech: JDBC JPA Teorii jste měli na přednášce, proto se jimi budeme zabývat jen velmi stručně. 1.0.1 Java Database Connectivity (JDBC) Nízkoúrovňový standard, který řeší spojení s databázovým strojem a jeho jednotné API. To v praxi znamená, že nám vrstva zvaná JDBC Driver poskytne spojení (Connection), přes které můžeme s databází komunikovat pomocí SQL dotazů/příkazů (objekty třídy Statement či PreparedStatement) podobně, jako z utilit typu PSQL. Rozdíl mezi Statement a PreparedStatement je ten, že Statement bere kompletní string, zatímco PreparedStatement umožňuje statement parametrizovat a přepoužít. Pokud chceme podobný dotaz využít vícekrát, jen s jinými hodnotami, je PreparedStatement především z hlediska výkonu jasně lepší variantou. Výstupem select dotazu je v JDBC ResultSet, který reprezentuje seznam řádků odpovídajících našemu dotazu. Sloupce seznamu odpovídají bud celé tabulce (v případě použití * v dotazu), či vybraným sloupcům dotazu. Hodnoty z ResultSetu získáváme při iteraci voláním funkcí gettype, kde Type je jeden z podporovaných typů, např. String, Boolean, Integer apod. Samozřejmě hodnota v daném sloupci musí být mapovatelná na specifikovaný typ. getboolean na sloupec typu INT tedy nebude fungovat. Tento přístup je pro rozsáhlejší využití v aplikaci poněkud nevhodný. Proto vznikly frameworky poskytující objektově-relační mapování (ORM). 1

1.1 ORM Zjednodušeně řečeno, objektově relační mapování je technika mapování tříd objektových programovacích jazyků (Java, C#) na databázové tabulky. Jednotlivé instance tak odpovídají řádkům tabulky a atributy objektů sloupcům v tabulce. Mapované třídy se v Javě (a v podstatě i obecně) nazývají entity. V minulosti vznikla řada ORM frameworků pro Javu. Hlavním zástupcem je jistě Hibernate. Tyto frameworky byly hnacím motorem pro vývoj standardu JPA. 1.1.1 Java Persistence API (JPA) JPA je tedy javovský standard pro ORM frameworky. Referenční implementací současné verze JPA 2.1 je Eclipselink. Hlavní třídou z JPA, se kterou přijde uživatel do styku, je EntityManager. Tato třída reprezentuje persistentní kontext. Řádky databáze lze pomocí entity manageru načíst (metoda find) jako objekty entity tříd a pracovat s nimi. Stejně tak můžeme nové řádky vkládat (persist) a existující mazat (remove). Jako poznámku na okraj uved me rozdíl mezi metodami persist a merge v interface EntityManager. persist slouží výhradně pro vkládání nových záznamů. Při pokusu o persist existujícího objektu dojde k výjimce. merge umí též vkládat nové objekty, ale jejím primárním účelem je aktualizace záznamu z detached entity (vzpomeňte na entity lifecycle). Všechny manipulující operace EntityManager jsou transakční, tudíž jejich efekty se projeví až po volání commit běžící transakce. Jak uvidíme za několik týdnů, frameworky typu Spring či Java EE implementace umožňují transakce ovládat deklarativně, obvykle na úrovni metod (začátek metody = transaction begin, konec = transaction commit). Zatím musíme transakci ovládat programaticky, volání metody gettransaction. Instance EntityManager, které samotné nejsou thread-safe, poskytuje objekt typu EntityManagerFactory, který vznikne při inicializaci persistentní jednotky (vizte dále). Spíše než podrobnému popisu JPA, který jsme měli v přednášce, se nyní věnujme některým drobnostem a tipům. Generated ID Generované identifikátory jsou velmi pohodlnou feature. Je třeba ovšem pamatovat na několik věcí. Za prvé, při vkládání nového objektu do DB nemusí být ID nastaveno okamžitě po volání persist. Specifikace říká, že ID musí být nastaveno v entitě při commitu transakce. Pro některé strategie generování ID je ID nastaveno hned při commitu, ale spoléhat na to nemůžeme. Equals a hashcode Definice vlastních metod equals a hashcode je běžná praxe. V případě entit je ale třeba mít se na pozoru. Lákavou a logicky vyhlížející možností je použití ID objektu. Problém nastává u entit s generovaným ID, kdy často ID není přítomno. V takové případě equals a hashcode těžko budou plnit svou funkci. Obdobně je třeba dávat si pozor na použití generovaného ID jako 2

součást atributů porovnávaných v equals a hashcode. Po vygenerování ID totiž dojde ke změně hashcode a můžete se dostat do situace, kdy kontejnery založené na hash objektů (např. HashMap, HashSet) budou tvrdit, že neobsahují objekt, který vám vrátily při iteraci. Obecně je tedy třeba důkladně popřemýšlet, jakou strategii implementace equals a hashcode zvolíme a zda je vůbec vhodné je přepisovat. 2 Demo aplikace 2.1 Spouštění Pro běh demo aplikace použijte bud databázi H2 jako na cvičení, nebo nastavte v persistence.xml spojení k PostgreSQL databázi (stačí url, username, heslo a třída driveru, vizte zakomentované nastavení tamtéž). Pokud chcete použít jinou databázi, musíte také přidat odpovídající JDBC driver jako Maven dependency do pom.xml. Pro H2 je postup následující: 1. cd cesta/k/rozbalene/h2/bin, 2. java -cp *.jar org.h2.tools.server, Na Windows musíte místo *.jar použít plné jméno jar souboru, Pokud je obsazený port 8082, na kterém startuje webová konzole H2, můžete nastavit jiný přepínačem -webport, 3. Otevře se vám prohlížeč s hlavní stránkou H2 konzole, vyberte nastavení Generic H2 (Server) a v JDBC URL nastavte jméno databáze (za posledním lomítkem). Můžete nastavit i username a heslo, Screenshot 1 ukazuje nastavení webové konzole stejně, jako jsme měli na cvičení, 4. Klikněte na Connect, 5. V IDE použijte JDBC URL, username a heslo z H2 databáze pro nastavení spojení v persistence.xml, 6. Otevřete a spust te cz.cvut.kbss.wpa.jdbc.main pro ukázku použití JDBC, 7. Otevřete a spust te cz.cvut.kbss.wpa.jdbc.main pro ukázku použití JPA, 8. Prostudujte si kód s využití poznámek níže. 3

2.2 Poznámky k aplikaci Obrázek 1: Nastavení H2 databáze. Přidejme pár poznámek k demo aplikaci. Persistence se inicializuje ve třídě PersistenceFactory, která slouží jako poskytovatel objektů typu EntityManager. Třída funguje jako jednoduchý singleton, ale není thread safe! Všimněte si, jak je EntityManagerFactory propojena s konfigurací persistence unit v persistence.xml. Třída BaseEntity funguje jako parent všech ostatních tříd a definuje identifikátor entit, abychom ho nemuseli v každé entitě opakovat. Person pak demonstruje využití dědičnosti v JPA, kdy narozdíl od BaseEntity má vlastní DB tabulku a slouží jako plnohodnotná entita. Zkuste si nastavit jiné strategie dědičnosti a sledujte, jak se mění struktura tabulek v DB. Employee je nyní podtřídou Person a dědí hodnoty jména a příjmení. Dále definuje vztah s třídou Department. Department.addEmployee ukazuje, jak vhodné je definovat chování entit. Zároveň tu vidíme nutnost nastavení obou stran vztahu Employee Department. Zkuste zakomentovat přidání zaměstnance do departmentu a spustit Main department najednou nemá zaměstnatnce, ačkoliv v DB je cizí klíč u zaměstnance prokazatelně nastaven. O mapování sloupců (jména, unikátnost, neprázdnost) jsme už mluvili na cvičení. Třídy Student a Course demonstrují další typ vztahů mezi entitami ManyToMany. V tomto případě jen jednosměrný. Ale klidně si zkuste přidat i druhou stranu vztahu ve třídě Course. Stačí seznam studentů oanotovat anotací @ManyToMany a v atributu mappedby specifikovat jméno odpovídajícího atributu ve třídě Student. Explicitní definice join tabulky ve třídy Student není nutná. Zkuste ji zakomentovat a podívejte se, jaké jméno zvolí JPA provider. Ještě doplňme, že není nutné pro multi-target vztahy používat jen List, stejně dobře by fungovaly Set či Collection. Nám se to hodí pro úkoly (vizte dále). 4

2.3 Vyzoušejte si Jako (nepovinný) úkol si můžete vyzkoušet následující: Vylistujte zaměstnance jednoho oddělení pomocí dotazu (můžete použít zaměstnance přidaného ve funkci addemployeetodepartment nebo si přidejte další): Nejprve nativní SQL dotaz, Pak JPQL dotaz (inspirovat se můžete JPQL dotazem ve funkci addstudentsandcourses), Upravte třídu Student, aby uspořádávala kurzy podle abecedy (vyzkoušejte tím, že přidáte studentovi více než jeden kurz a načtete ho z DB), Přidejte třídu Phone, která bude v OneToOne vztahu s třídou Employee. Zda by měl být vztah jedno či oboustranný necháme na vás. 5