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

Podobne dokumenty
Bazy danych tworzenie aplikacji bazodanowych ORM / JPA

Java Persistence API - zagadnienia zaawansowane

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

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

Dostęp do baz danych w aplikacjach Java EE

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

Projektowanie oprogramowania. Warstwa integracji z bazą danych oparta na technologii ORM Platforma Java EE Autor: Zofia Kruczkiewicz

Informacje wstępne Autor Zofia Kruczkiewicz Wzorce oprogramowania 4

Tworzenie komponentów logiki biznesowej i warstwy dostępu do danych w oparciu o EJB3.0/JPA lub EJB 3.1/JPA2

Mapowanie obiektowo-relacyjne z wykorzystaniem Hibernate

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

EJB 3.0 (Enterprise JavaBeans 3.0)

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

Zaawansowane aplikacje internetowe - laboratorium

Podejście obiektowe do relacyjnych baz danych Hibernate.

Kurs programowania aplikacji bazodanowych

Programowanie wielowarstwowe i komponentowe

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Wzorce dystrybucji i wspólbieżności autonomicznej

Wprowadzenie do Doctrine ORM

Programowanie obiektowe

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

ORM w Javie. Adam Michalik 2007

PHP: bazy danych, SQL, AJAX i JSON

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Oracle PL/SQL. Paweł Rajba.

Enterprise JavaBeans

akademia androida Składowanie danych część VI

Kurs programowania aplikacji bazodanowych

Projektowanie aplikacji z bazami danych

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

Hibernate. Od Nowicjusza do Profesjonalisty. Dave Minter Jeff Linwood

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

NHibernate Hibernate dla platformy.net. Hibernate posiada także dużą społeczność, zatem nietrudno uzyskać jakieś wsparcie w przypadku problemów.

Programowanie obiektowe

Enterprise JavaBeans. 1. Architektura EJB: komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 2. Kontenery EJB JBoss.

Podstawy programowania III WYKŁAD 2

SYSTEM MONITORINGU PARAMETRÓW WĘZŁÓW PRZECHOWYWANIA DANYCH DLA PROJEKTU KRAJOWY MAGAZYN DANYCH PODRĘCZNIK DEWELOPERA

Enterprise JavaBeans 3.0

JAVA EE MODEL APLIKACJI. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Niezbędne serwery aplikacji. Wprowadzenie do technologii JBoss i Apache Tomcat.

Oracle PL/SQL. Paweł Rajba.

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

Podstawowe wykorzystanie Hibernate

Wzorce logiki dziedziny

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

Obsługa transakcji rozproszonych Java. Marek Wojciechowski, Maciej Zakrzewicz Instytut Informatyki, Politechnika Poznańska

JAVA I BAZY DANYCH. MATERIAŁY:

Informatyka I. Programowanie aplikacji bazodanowych w języku Java. Standard JDBC.

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

Kurs WWW. Paweł Rajba.

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Ustawienie na poziomie sesji (działa do zmiany lub zakończenia sesji zamknięcia połączenia).

Wdrożenie do projektu

Informatyka I. Standard JDBC Programowanie aplikacji bazodanowych w języku Java

Technologia informacyjna

Przypisywanie bibliotek w architekturze SAS

*Grafomania z. Neo4j. Praktyczne wprowadzenie do grafowej bazy danych.

Java Persistence API (JPA)

PLAN WYKŁADU BAZY DANYCH PODSTAWOWE KWESTIE BEZPIECZEŃSTWA OGRANICZENIA DOSTĘPU DO DANYCH

Podstawowe informacje o technologii Java Persistence API - przykład

INTENSE PLATFORM Zmiany w wersji Wersja 7.2

Administracja i programowanie pod Microsoft SQL Server 2000

Wzorce projektowe i architektura dla platformy Java EE

Szkolenie wycofane z oferty. Program szkolenia: Enterprise Java Beans 3.0/3.1

Rola EJB na platformie Java EE. Enterprise JavaBeans (EJB)

Database Connectivity

Enterprise JavaBeans (EJB)

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

LABORATORIUM 8,9: BAZA DANYCH MS-ACCESS

Gdzie jest moja tabela?

JBoss Application Server

Paweł Cieśla. Dokumentacja projektu

Plan. Formularz i jego typy. Tworzenie formularza. Co to jest formularz? Typy formularzy Tworzenie prostego formularza Budowa prostego formularza

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

JPA Java Persistance API

QUERY język zapytań do tworzenia raportów w AS/400

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

Serwery aplikacji. dr Radosław Matusik. radmat

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Platformy Technologiczne

Java Persistence API. Class powinny być zaznaczone. Kliknij przycisk Finish.

Wprowadzenie do baz danych

Podstawy frameworka Spring

Usługa TimerService

Relacyjne bazy danych a XML

Baza danych sql. 1. Wprowadzenie

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

Zaawansowane Techniki Bazodanowe

Tworzenie aplikacji dla Oracle Application Server 10g R3 w technologii EJB 3.0

Platformy Technologiczne

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

Projekt INP Instrukcja 2. Autor Dr inż. Zofia Kruczkiewicz

Aplikacje internetowe i rozproszone - laboratorium

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2016

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

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

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Widżety KIWIPortal. tworzenie umieszczanie na stronach internetowych opcje zaawansowane. Autor: Damian Rebuś Data: Wersja: 1.

Transkrypt:

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

JPA w aplikacji Java EE Połączeniem z bazą danych zarządza serwer aplikacji Konfiguracja danych dostępowych zależna od wybranego serwera Konfiguracja nie występuje w kodzie samej aplikacji n Przenośność pomiędzy serwerami (+) n Rozproszenie konfiguracji (-) Serwer wykorzystuje pulę połączeń z bazą danych do obsługi wielu użytkowników Połączenie jest udostępniane aplikacji jako zasób JNDI (Java Naming and Directory Interface)

JPA w aplikacji Java EE Wstrzykiwanie obiektu klasy EntityManager: @PersistenceContext EntityManager em; Transakcje na serwerze Java EE Zarządzane przez kontener w warstwie EJB Zarządzane przez użytkownika (dewelopera) Serwery Java EE umożliwiają realizację transakcji rozproszonych Operacje na wielu bazach danych w jednej transakcji Jedna transakcja obejmująca wiele serwerów aplikacji n Z których każdy wykorzystuje własną bazę/bazy danych

Transakcje zarządzane przez użytkownika Wstrzyknięcie obiektu transakcji: @Resource UserTransaction utx; Operacje na bazie danych: try { utx.begin(); //... utx.commit(); } catch (Exception ex) { utx.rollback(); }

Dziedziczenie w klasach encyjnych Model domenowy może wykorzystywać hierarchię dziedziczenia Szczególnie dla złożonych domen biznesowych, np. w aplikacjach korporacyjnych Model domenowy jest utrwalany w bazie danych Konieczna jest obsługa relacji dziedziczenia w czasie mapowania obiektowo-relacyjnego

Dziedziczenie w JPA JPA obsługuje dwa scenariusze użycia: Klasa bazowa nie jest samodzielną encją n W klasie bazowej: @MappedSuperclass n W klasach pochodnych: brak dodatkowej konfiguracji n Pola klasy bazowej odzwierciedlane jako dodatkowe kolumny w tabeli klasy pochodnej Klasa bazowa jest samodzielną encją n W klasie bazowej: @Inheritance(strategy = ) @DiscriminatorColumn(name = "type") @DiscriminatorValue("book") n W klasach pochodnych: @DiscriminatorValue("comics")

Strategia mapowania (dla dziedziczenia encji) Dla dziedziczenia z wykorzystaniem encji jako klasy bazowej dostępne są 3 strategie mapowania: SINGLE_TABLE n Pojedyncza tabela dla całej hierarchii dziedziczenia TABLE_PER_CLASS n Odrębna tabela dla każdej klasy konkretnej w hierarchii dziedziczenia n Każda z tabel zawiera kolumny dla pól dziedziczonych oraz pól samej klasy JOINED n Wspólna tabela z kolumnami dla pól klasy bazowej n Dodatkowe tabele dla pól klas pochodnych Wady i zalety poszczególnych strategii

Wersjonowanie obiektów encyjnych Problem edycji tego samego obiektu encyjnego przez różnych użytkowników Systemy z wielodostępem, np. aplikacje korporacyjne Czas od pobrania encji z bazy danych do zapisu zmian może być długi n Czas spędzony przez użytkownika w formularzu edycji n Kolejny użytkownik może rozpocząć edycję encji zanim poprzedni zakończy swoją Bez wersjonowania: nadpisywanie danych Najnowszy UPDATE wygrywa

Wersjonowanie obiektów encyjnych JPA oferuje podstawowy model wersjonowania encji z optymistycznym blokowaniem (ang. optimistic locking) Optymistycznie zakładamy, że konflikt nie wystąpi n Dwóch użytkowników nie rozpocznie edycji równolegle ale jeśli jednak wystąpi, zablokujemy możliwość nadpisania danych o wyższym numerze wersji Przydatne gdy konflikty występują rzadko n Większość zapisów kończy się powodzeniem n Sporadyczne odrzucenia nie są uciążliwe dla użytkowników n Aplikacja powinna pomóc użytkownikowi w scaleniu danych z konfliktujących wersji

Dla porównania: blokowanie pesymistyczne Pesymistycznie zakładamy, że nastąpi konflikt Aby mu zapobiec blokujemy możliwość rozpoczęcia edycji, jeśli inny użytkownik ją rozpoczął Informujemy użytkownika o zaistniałej sytuacji np. Nie możesz edytować tego dokumentu, bo jest on edytowany przez użytkownika Waldemar Korłub od 2016-10-18 10:45 GMT

Wersjonowanie w JPA Wersjonowana klasa encyjna powinna zawierać pole wersji: @Version private int version; JPA zwiększa numer wersji w bazie danych przy każdym zapisie Jeśli wersja w bazie danych jest większa niż wersja zapisywanego obiektu encyjnego odrzucenie zapisu

JPA a SQL JPA jest warstwą abstrakcji ponad językiem SQL Zapytania SQL są generowane przez bibliotekę ale deweloper ma wiele możliwości, aby na nie wpływać i specyfikować pożądane zachowania Domyślne zachowania są właściwe dla najczęstszych przypadków użycia W innych przypadkach mogą skutkować poważnymi problemami z wydajnością aplikacji Wykorzystanie JPA nie zwalnia dewelopera ze znajomości bazy danych i mechanizmów jej działania!

Logowanie zapytań SQL Możliwość logowania zapytań SQL ułatwia diagnozowanie problemów Konfiguracja w pliku persistence.xml (po stronie aplikacji): Hibernate: <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> EclipseLink: <property name="eclipselink.logging.level.sql" value="fine"/> <property name="eclipselink.logging.parameters" value="true"/>

Logowanie zapytań SQL Zaleca się konfigurację poziomów logowania na serwerze zamiast użycia pliku persistence.xml Hibernate na serwerze Wildfly: Plik standalone/configuration/standalone.xml Poziomy logowania definiowane w sekcji: <subsystem xmlns="urn:jboss:domain:logging:3.0"> Logowanie zapytań SQL: <logger category="org.hibernate.sql"> <level name="debug"/> </logger>

Logowanie zapytań SQL Hibernate na serwerze Wildfly ciąg dalszy: Logowanie wartości parametrów zapytań SQL: <logger category="org.hibernate.type.descriptor.sql"> <level name="trace"/> </logger> Logowanie informacji o grupowaniu zapytań: <logger category="org.hibernate.engine.jdbc.batch"> <level name="debug"/> </logger>

Logowanie zapytań SQL Hibernate na serwerze Wildfly ciąg dalszy: Aby informacje były widoczne na konsoli konieczne jest ustawienie poziomu wyświetlanych komunikatów n TRACE lub DEBUG w zależności od wcześniejszych ustawień: <console-handler name="console"> <level name="trace"/> <formatter> <named-formatter name="color-pattern"/> </formatter> </console-handler>

Grupowanie zapytań (ang. batch queries) Popularne implementacje JPA przy ustawieniach domyślnych nie grupują zapytań SQL Każdy INSERT/UPDATE wykonywany jako osobne zapytanie Narzut po stronie bazy danych na parsowanie zapytań W przypadku wielu zapisów w jednej transakcji grupowanie znacząco skraca czas obsługi Konfigurację grupowania może określić w pliku persistence.xml

Grupowanie zapytań INSERT/UPDATE (biblioteka Hibernate) Maksymalna liczba grupowanych zapytań: <property name="hibernate.jdbc.batch_size" value="50"/> Pojedynczy batch może odnosić się do jednej tabeli Problem grupowania przy zapisywaniu na zmianę obiektów różnych typów Szeregowanie operacji: <property name="hibernate.order_inserts" value="true"/> <property name="hibernate.order_updates" value="true"/> Obsługa grupowania dla wersjonowanych encji: <property name="hibernate.jdbc.batch_versioned_data" value="true"/> Hibernate wyłączy grupowanie jeśli napotka: @GeneratedValue(strategy = GenerationType.IDENTITY)

Grupowanie w zapytaniach SELECT (biblioteka Hibernate) Liczba obiektów wczytywanych jednorazowo w czasie ładowania powiązanych encji: <property name="hibernate.default_batch_fetch_size" value="20"/> Liczba wierszy odczytywanych jednorazowo z kursora bazodanowego dla zapytania SELECT: <property name="hibernate.jdbc.fetch_size" value="50"/>

Studium przypadku: Problem 1+N zapytań Przykładowa aplikacja (JPA_1_plus_N) Na rozgrzewkę: grupowanie zapytań INSERT Problem 1+N zapytań przy ładowaniu danych @ManyToMany(fetch = ): n FetchType.LAZY pobieranie danych z bazy na żądanie n FetchType.EAGER pobranie wszystkich danych bezpośrednio po załadowaniu encji (niezalecane) n Wpływ ustawienia hibernate.default_batch_fetch_size na sposób pobierania danych Składnia LEFT JOIN FETCH

Grafy encji (ang. entity graphs) Sposób ładowania powiązanych obiektów encyjnych można również określić za pomocą grafu encji Domyślny graf encji wynika z wartości atrybutów fetch w adnotacjach @OneToOne, @OneToMany itd. n Nie zaleca się używania strategii FetchType.EAGER n Jeśli użyto wyłącznie strategii FetchType.LAZY, to domyślny graf encji nie zawiera żadnych związków Pożądany graf encji należy podać jako wskazówkę (ang. hint) dla JPA w czasie budowania zapytania

Grafy encji (ang. entity graphs) Związki występujące w grafie są ładowane w ramach jednego zapytania Pozostałe związki są ładowane w zależności od użytej wskazówki: javax.persistence.loadgraph pozostałe związki zgodnie z grafem domyślnym javax.persistence.fetchgraph pozostałe związki nie są ładowane UWAGA: biblioteka Hibernate traktuje opcję fetchgraph tak samo jak loadgraph https://hibernate.atlassian.net/browse/hhh-8776

Definicja grafu W klasie encyjnej: @NamedEntityGraphs({ @NamedEntityGraph( name = Invoice.Graphs.WITH_ADDRESS, attributenodes = {@NamedAttributeNode("address")}) }) public class Invoice implements Serializable { public static class Graphs { public static final String WITH_ADDRESS="Invoice{address}"; } } //... @ManyToOne Address address;

Wykorzystanie grafu Dla obiektu klasy Query: TypedQuery<Invoice> query = em.createquery( "SELECT a FROM Invoice a", Invoice.class); query.sethint("javax.persistence.loadgraph", em.getentitygraph(invoice.graphs.with_address)); List<Invoice> invoices = query.getresultlist(); W metodzie EntityManager.find(): EntityGraph entitygraph = em.getentitygraph(invoice.graphs.with_address); Invoice invoice = em.find(invoice.class, id, singletonmap("javax.persistence.loadgraph", entitygraph));

Pytania?