Java Enterprise Edition spotkanie nr 6. przygotował Jacek Sroka. Java Persistence API

Podobne dokumenty
Przygotował: Jacek Sroka. Java Persistence API

Bazy danych tworzenie aplikacji bazodanowych ORM / JPA

JPA Java Persistance API

ORM w Javie. Adam Michalik 2007

JAVA PERSISTENCE API. Wykorzystano fragmenty wykładów M. Piotrowskiego i M. Wójcika. Waldemar Korłub

Wykład 8. SQL praca z tabelami 5

Relacje. 1. Modelowanie relacji. - siedem rodzajów relacji J2EE. - relacje jedno i wielokierunkowe, - relacje reprezentowane przez kolekcje.

Relacje. 1. Modelowanie relacji. - siedem rodzajów relacji J2EE. - relacje jedno i wielokierunkowe, - relacje reprezentowane przez kolekcje.

Utrwalanie danych zastosowanie obiektowego modelu danych warstwy biznesowej do generowania schematu relacyjnej bazy danych Przykład

Nowy powiew od Słońca: EJB 3.0. Copyright Piotr Kochański & Erudis,

Oracle PL/SQL. Paweł Rajba.

Dostęp do baz danych w aplikacjach Java EE

Podstawowe informacje o technologii Java Persistence API

Zasady generowania kluczy głównych Język Java Persistence Podstawowa architektura wielowarstwowych aplikacji w oparciu o wzorce oprogramowania

Programowanie w języku Java. Bazy danych SQLite w Javie

JAVA PERSISTENCE API CZĘŚĆ 2 ASPEKTY ZAAWANSOWANE. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Programowanie obiektowe

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Metody dostępu do danych

Tworzenie tabel. Bazy danych - laboratorium, Hanna Kleban 1

Instrukcja 5 Laboratorium z Podstaw Inżynierii Oprogramowania. Warstwy integracji z bazą danych: Wzorzec DAO Technologia ORM

Programowanie wielowarstwowe i komponentowe

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

Wprowadzenie do projektowania i wykorzystania baz danych Relacje

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Hibernate. Od Nowicjusza do Profesjonalisty. Dave Minter Jeff Linwood

Hibernate. Adrian Gawor, Adam Klekotka, Piotr Kubisz. Technologie Biznesu Elektronicznego. 12 maja 2009

Paweł Rajba

Wykład 6. SQL praca z tabelami 3

EJB 2.x oraz zmiany w standardzie dla EJB 3.0. Michał Stanek

Autor: Joanna Karwowska

Relacyjne bazy danych. Podstawy SQL

Bazy danych. Plan wykładu. Diagramy ER. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych

Jerzy Nawrocki, Wprowadzenie do informatyki

Język SQL, zajęcia nr 1

E:\DYDAKTYKA\ZAI\ZWWW\Laboratoria\L07\Java Persistence.doc 2011-lis-24, 17:0 Zaawansowane aplikacje internetowe Laboratorium Java Persistence.

Tworzenie warstwy integracji i uzupełnienie wartwy prezentacji w wielowarstwowej aplikacji Przykład w środowisku Visual Web JSP

Dziedziczenie i język EJB QL

Indeksowanie w bazach danych

Przykładowa baza danych BIBLIOTEKA

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

Zaawansowane aplikacje internetowe - laboratorium

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

Enterprise JavaBeans 3.0

Informacje wstępne Autor Zofia Kruczkiewicz Wzorce oprogramowania 4

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Przykłady najlepiej wykonywać od razu na bazie i eksperymentować z nimi.

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

Wykład 5. SQL praca z tabelami 2

Relacyjne bazy danych. Podstawy SQL

Oracle11g: Wprowadzenie do SQL

Platformy Programistyczne Podstawy języka Java

SQL (ang. Structured Query Language)

Technologie baz danych

Język SQL, zajęcia nr 2

Gdzie jest moja tabela?

Język DML. Instrukcje DML w różnych implementacjach SQL są bardzo podobne. Podstawowymi instrukcjami DML są: SELECT INSERT UPDATE DELETE

Karolina Rusin, Paweł Biczysko, Michał Olejnik. 11 maja 2009

Podstawowe wykorzystanie Hibernate

Podstawy języka SQL. standardy SQL formułowanie zapytań operacje na strukturach danych manipulowanie danymi. Bazy danych s.5-1

E:\DYDAKTYKA\ZAI\ZWWW\Laboratoria\L07\Java Persistence.doc 2011-lis-24, 17:0 Zaawansowane aplikacje internetowe Laboratorium Java Persistence.

Bazy danych 7. SQL podstawy

mgr inż. Michał Paluch

Zadania z SQLa (MS SQL Server)

Wprowadzenie do języka SQL

Autor: Joanna Karwowska

akademia androida Składowanie danych część VI

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Dr Michał Tanaś(

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

P o d s t a w y j ę z y k a S Q L

Serwery aplikacji. mgr Radosław Matusik. Wydział Matematyki i Informatyki Uniwersytetu Łódzkiego radmat radmat@math.uni.lodz.

Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski.

Systemy GIS Tworzenie zapytań w bazach danych

Java EE: JSF + EJB + JPA

Enterprise JavaBeans

Konstruowanie Baz Danych SQL UNION, INTERSECT, EXCEPT

Autor Zofia Kruczkiewicz Wzorce oprogramowania - laboratorium5_6

Podstawowe pojęcia dotyczące relacyjnych baz danych. mgr inż. Krzysztof Szałajko

Podejście obiektowe do relacyjnych baz danych Hibernate.

Zbiór pytań nr 2. 1 Tabela DEPARTMENTS ma następującą strukturę:

EJB 3.0 & JBoss Seam. 25 kwietnia 2007 Jacek Gerbszt 1

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Szkolenie Oracle SQL podstawy. Terminy lutego 2010 First Minute! 1100zł!

Bazy danych 10. SQL Widoki

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Strumieniowe bazy danych. Piotr i Paweł

Odwzorowanie obiektowo-relacyjne

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Programowanie obiektowe

Java Persistence API (JPA)

Bazy danych 6. Klucze obce. P. F. Góra

Integralność danych Wersje języka SQL Klauzula SELECT i JOIN

Programowanie obiektowe

Tomasz Dobek.

Agenda. Grzegorz Wilaszek, Wojciech Krzystek

Aspekty aktywne baz danych

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Transkrypt:

Java Enterprise Edition spotkanie nr 6 Java Persistence API

Trwałość Serializacja dane reprezentowane binarnie lub w XMLu brak wyszukiwania brak transakcji O/R mapping zazwyczaj: klasa->tabela, obiekt->wiersz, atrybut->wartość w kolumnie ręcznie JDBC automatycznie Hibernate, Toplink, JDO można dostroić do istniejącej bazy Java Persistence specyfikacja wyłapująca najlepsze pomysły z istniejących rozwiązań POJO anotacje (deskryptory mają większy priorytet) 2

Jak zacząć? Persistence punkt wejściowy czyta persistence.xml z META-INF Persistence Unit ma nazwę i opisuje połączenie z bazą zdefiniowane w persistence.xml może wymieniać encje, które nadzoruje/nie nadzoruje EntityManagerFactory reprezentuje Persistence Unit Persistence Context zbiór encji, których utrwalanie nadzoruje Persistence Provider w jego ramach encje mają unikatową tożsamość i reprezentują trwałe dane EntityManager metody pozwalające nadzorować trwałość cache pierwszego poziomu nie wielowątkowy 3

Pierwszy przykład @Entity public class Person { @Id @GeneratedValue private int id; private String firstname; private char middleinitial; private String lastname; private String streetaddress1; private String streetaddress2; private String city; private String state; private String zip;... 4

Pierwszy przykład EntityManagerFactory emf = Persistence.createEntityManagerFactory("examplePersistenceUnit"); EntityManager em = emf.createentitymanager(); Person p1 = new Person("Brett", 'L', "Schuchert", "Street1", "Street2", "City", "State", "Zip"); Person p2 = new Person("FirstName", 'K', "LastName", "Street1", "Street2", "City", "State", "Zip"); em.gettransaction().begin(); em.persist(p1); em.persist(p2); em.gettransaction().commit(); final List<Person> list = em.createquery("select p from Person p").getresultlist(); for (Person current : list) System.out.println(current.getFirstName()); em.close(); 5

Wydzielamy adres @Embeddable public class Address { private String streetaddress1; private String streetaddress2; private String city; private String state; private String zip;... @Entity public class Person { @Id @GeneratedValue int id; private String firstname; private char middleinitial; private String lastname;... @Embedded private Address address; 6

Dodajemy firmę @Entity public class Company { @Id @GeneratedValue int id; private String name; @Embedded private Address address; @OneToMany private Collection<Person> employees;... final Company c1 = new Company(); c1.setname("the Company"); c1.setaddress(new Address("D Rd.", "", "Paris", "TX", "77382")); List<Person> people = generatepersonobjects(); for (Person p : people) c1.hire(p); em.gettransaction().begin(); for (Person p : people) em.persist(p); em.persist(c1); em.gettransaction().commit(); 7

Encje: podstawowe informacje Encje to POJO zanotowane javax.persistence.entity tych samych klas da się używać w całej aplikacji Musi istnieć publiczny lub chroniony, bezargumentowy konstruktor Klasa, metody ani utrwalane atrybuty nie mogą być oznaczone jako final Encje mogą rozszerzać zarówno inne encje jak i zwykłe klasy Zwykłe klasy mogą rozszerzać encje Stan encji może być badany przy pomocy bezpośredniego dostępu do atrybutów (private, protected lub domyślna wid. pak.) lub metodami get/set dostęp do atrybutów nie powinien być bezpośredni anotacje dla właściwości umieszczamy przy getterze Atrybuty które mają nie być utrwalane w bazie danych należy zanotować javax.persistence.transient lub oznaczyć modyfikatorem transient 8

Typy atrybutów/właściwości typy podstawowe java.lang.string inne typy serializowalne, w tym: typy opakowujące typy serializowalne zdefiniowane przez użytkownika java.math.biginteger, java.math.bigdecimal java.util.date, java.util.calendar, java.sql.date, java.sql.time, java.sql.timestamp byte[], Byte[], char[], Character[] typy wyliczeniowe inne encje kolekcje encji tylko: Collection, Set, List, Map ewentualnie odmiany generyczne klasy zanurzone (embeddable classes) 9

Cykl życia new nie ma persistence identity, ani nie należy do persistence context managed ma i należy detached ma i nie należy removed należy, ale ma być usunięta z bazy po wywołaniu remove() encja jest zaplanowana do usunięcia, ale usuwana dopiero przy zatwierdzaniu transakcji lub po wywołaniu flush() po merge() encja zaczyna na powrót należeć przestać może jak zakończył się persistence context (patrz SLSB) lub została zdeserializowana merge() zwraca nową encję, a nie przekazany parametr (chyba, że przekazaliśmy encję managed) 10

Związki Rodzaje związków 1-1, 1-m, n-1, n-m jedno/dwukierunkowe czyli 7 możliwych kombinacji! Związki dwukierunkowe mają dwie strony owning oraz inverse Strona inverse musi się odwoływać do strony owning przy pomocy elementu mappedby anotacji @OneToOne, @OneToMany oraz @ManyToMany W dwukierunkowych związkach n-1 strona wiele jest zawsze owning i nie może posiadać elementu mappedby W dwukierunkowych związkach 1-1 strona owning posiada klucz obcy W dwukierunkowych związkach n-m każda ze stron może być owning 11

Związki c.d. Kaskadowość np. @OneToOne(cascade={CascadeType.PERSIST) możliwe elementy tablicy PERSIST, MERGE, REMOVE, REFRESH oraz ALL wskazują jakie operacje przenoszą się kaskadowo na elementy pozostające w związku domyślnie tablica jest pusta Leniwe/Gorliwe ładowanie ze względu na efektywność domyślnie jest FetchType.LAZY jeżeli encje są przekazywane klientowi (datached) używamy FetchType.EAGER fetch joins 12

Przykład 1-1 @Entity(name="OrderUni") public class Order implements Serializable { private int id; private String ordername; private Shipment shipment; @Id @GeneratedValue public int getid() { return id; public void setid(int id) { this.id = id; @OneToOne(cascade={CascadeType.PERSIST) public Shipment getshipment() { return shipment; public void setshipment(shipment shipment){ this.shipment = shipment; Związek w bazie CREATE TABLE ORDERUNI ( ID INTEGER NOT NULL, ORDERNAME VARCHAR(255), SHIPMENT_ID INTEGER ); specyfikacja określa zasady nazywania klucza obcego Dla wersji jednokierunkowej w Shipment nie trzeba nic zmieniać... 13

Przykład 1-1 BasicConfigurator.configure(); Logger.getLogger("org").setLevel(Level.ERROR); final EntityManagerFactory emf = Persistence.createEntityManagerFactory("jee6"); final EntityManager em = emf.createentitymanager(); em.gettransaction().begin(); dosomestuff(em); System.out.println("Unidirectional One-To-One test\n"); @SuppressWarnings("unchecked") List<Order> li = em.createquery("select o FROM OrderUni o").getresultlist(); for (Order o : li) { System.out.println("Order "+o.getid()+": "+o.getordername()); System.out.println("\tShipment details: "+o.getshipment().getcity()+ +o.getshipment().getzipcode()); em.gettransaction().commit(); 14

1-1 wersja dwukierunkowa @Entity(name="ShipmentBi") public class Shipment { private int id; private String city; private String zipcode; private Order order; @Id @GeneratedValue public int getid() { return id; public void setid(int id) { this.id = id; @OneToOne(mappedBy="shipment") public Order getorder() { return order; public void setorder(order order) { this.order = order;... Przy pomocy parametru mappedby wskazujemy, który atrybut encji Order realizuje związek Reprezentacja w bazie i encja Order się nie zmieniają Trzeba pamiętać o utrzymywaniu związku między obiektami Shipment s = new Shipment(); s.setcity("austin"); s.setzipcode("78727"); Order o = new Order(); o.setordername("software Order"); o.setshipment(s); s.setorder(o); em.persist(o); 15

1-m wersja dwukierunkowa @Entity(name="Employee1MBid") public class Employee { private int id; private String name; private char sex; private Company company;... @Entity(name="Company1MBid") public class Company { private int id; private String name; private Collection<Employee> employees = new ArrayList<Employee>();... @ManyToOne public Company getcompany() { return company; public void setcompany(company company) { this.company = company; @OneToMany(cascade={CascadeType.ALL fetch=fetchtype.eager, mappedby="company") public Collection<Employee> getemployees() { return employees; public void setemployees( Collection<Employee> employees) { this.employees = employees; 16

1-m wersja dwukierunkowa final EntityManagerFactory emf = Persistence.createEntityManagerFactory("jwt10"); final EntityManager em = emf.createentitymanager(); em.gettransaction().begin(); deleteall(em); dosomestuff(em); @SuppressWarnings("unchecked") List<Company> lic = em.createquery("select c FROM Company1MBid c").getresultlist(); for (Company c : lic) { System.out.println("Employees of company: "+c.getname()); for (Employee e : c.getemployees()) { System.out.println("\tName: "+e.getname()+", Sex: "+e.getsex()); System.out.println(); System.out.println(); @SuppressWarnings("unchecked") List<Employee> lie = em.createquery("select e FROM Employee1MBid e").getresultlist(); for (Employee e : lie) { Company c = e.getcompany(); System.out.println("Employee: "+e.getname()+" works for: "+c.getname()); em.gettransaction().commit(); 17

1-m jedno vs wielokierunkowe związek jednokierunkowy CREATE TABLE COMPANY1MUNI ( ID INTEGER NOT NULL, NAME VARCHAR(255) ); CREATE TABLE COMPANY1MUNI_EMPLOYEE1MUNI ( COMPANY1MUNI_ID INTEGER NOT NULL, EMPLOYEES_ID INTEGER NOT NULL ); --po stronie wiele powinny być więzy UNIQUE CREATE TABLE EMPLOYEE1MUNI ( ID INTEGER NOT NULL, SEX CHAR(1) NOT NULL, NAME VARCHAR(255) ); związek wielokierunkowy CREATE TABLE COMPANY1MBID ( ID INTEGER NOT NULL, NAME VARCHAR(255) ); CREATE TABLE EMPLOYEE1MBID ( ID INTEGER NOT NULL, SEX CHAR(1) NOT NULL, NAME VARCHAR(255), COMPANY_ID INTEGER ); 18

EJB-QL Grupowe operacje UPDATE i DELETE Złączenia GROUP BY HAVING Projekcje Podzapytania Zapytania dynamiczne Nazwane zapytania Tworzenie w zapytaniu nowych obiektów 19

Grupowe operacje UPDATE i DELETE Operacja dotyczy encji (i wszystkich jej podklas) Operacja nie przenosi się kaskadowo na powiązane encje np. w przykładzie 1-m w wersji jednokierunkowej zadziałają więzy dla tabeli złączeniowej Zmiany zachodzą bezpośrednio w bazie danych obchodzone jest optymistyczne blokowanie (kolumna z wersją nie jest automatycznie uaktualniana) Persistence Context nie jest synchronizowany z wynikiem operacji Query q = em.createquery("delete FROM RoadVehicleSingle"); q.executeupdate(); Query q = em.createquery("update RoadVehicleJoined r SET r.numpassengers = 1"); q.executeupdate(); 20

Złączenia Mogą służyć do: selekcji danych, dla których spełniony jest warunek złączenia do kontrolowania gorliwego ładowania Przykłady (można też używać składni tradycyjnej): JOIN SELECT DISTINCT c FROM Company1MUni c JOIN c.employees LEFT JOIN SELECT DISTINCT c FROM Company1MUni c LEFT JOIN c.employees LEFT OUTER JOIN SELECT DISTINCT c FROM Company1MUni c LEFT JOIN FETCH c.employees 21

Klauzule GROUP BY i HAVING Można używać GROUP BY i HAVING SELECT e.sex, count(e) FROM Employee1MUni e GROUP BY e.sex HAVING count(e) > 0 Wynikiem jest lista krotek (tu par) obiektów @SuppressWarnings("unchecked") List<Object[]> lic1 = em.createquery("select e.sex, count(e) FROM Employee1MUni e GROUP BY e.sex HAVING count(e) > 0").getResultList(); for (Object[] o : lic1) { boolean czykobieta = (Character) o[0] == 'F'; System.out.println("Na uczelniach pracuje: "+o[1]+" "+ ((czykobieta)? "kobiet" : "męszczyzn")); 22

Projekcje/Podzapytania Wersja dwukierunkowa SELECT e.name, c.name FROM Employee1MBid e, Company1MBid c WHERE e.company = c Wersja jednokierunkowa SELECT e.name, c.name FROM Employee1MUni e, Company1MUni c WHERE e IN (SELECT em FROM c.employees em) Albo po prostu SELECT e.name, c.name FROM Company1MUni c JOIN c.employees e 23

Tworzenie w zapytaniu nowych obiektów class PracFirma { String pname; String cname; public PracFirma(String name, String name2) { pname = name; cname = name2; public String tostring() { return "PracFirma("+pName+","+cName+")"; @SuppressWarnings("unchecked") List<PracFirma> li7 = em.createquery("select NEW jee6.reszta.pracfirma(e.name, c.name) FROM Company1MUni c JOIN c.employees e").getresultlist(); for (PracFirma o : li7) System.out.println(o); 24

Zapytania dynamiczne Query q4 = em.createquery("select e FROM Employee1MUni e WHERE e.name LIKE :empname"); @SuppressWarnings("unchecked") List<Employee> lic4 = q4.setparameter("empname", "%").getresultlist(); for (Employee e : lic4) { System.out.println("Name: "+e.getname()+", Sex: "+e.getsex()+"\n"); uwaga na SQL-injection jednokrotnie przygotowywany plan zapytania 25