ORM w Javie. Adam Michalik 2007

Podobne dokumenty
Mapowanie obiektowo-relacyjne z wykorzystaniem Hibernate

Enterprise JavaBeans

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

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

Informacje wstępne Autor Zofia Kruczkiewicz Wzorce oprogramowania 4

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

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

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

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

Java Persistence API - zagadnienia zaawansowane

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

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

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

JPA Java Persistance API

Budowa aplikacji w technologii. Enterprise JavaBeans. Maciej Zakrzewicz PLOUG

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Dokumentacja do API Javy.

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

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

Programowanie obiektowe

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

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

Plan prezentacji. Budowa aplikacji w technologii Enterprise JavaBeans. Przegląd architektur: CORBA. Cele budowy aplikacji rozproszonych

Aplikacje w środowisku Java

Bazy danych tworzenie aplikacji bazodanowych ORM / JPA

Metody dostępu do danych

Java Język programowania

Programowanie obiektowe

Programowanie wielowarstwowe i komponentowe

Gdzie jest moja tabela?

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

Enterprise JavaBean 3.0

Platformy Programistyczne Podstawy języka Java

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Wykład 6 Dziedziczenie cd., pliki

Dostęp do baz danych w aplikacjach Java EE

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie w języku Java WYKŁAD

Programowanie komponentowe

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

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

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

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne

EJB 3.0 (Enterprise JavaBeans 3.0)

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

Dziedziczenie. Tomasz Borzyszkowski

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

Tomasz Dobek.

Programowane refleksyjne i serializacja

Hibernate. Od Nowicjusza do Profesjonalisty. Dave Minter Jeff Linwood

Oracle PL/SQL. Paweł Rajba.

Programowanie obiektowe

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Podstawowe informacje o technologii Java Persistence API - przykład

Programowanie obiektowe

Aplikacje Internetowe, Servlety, JSP i JDBC

Wywoływanie metod zdalnych

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Diagramy klas. dr Jarosław Skaruz

Programowanie obiektowe

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

MAPOWANIE OBIEKTOWO-RELACYJNE (ORM) CZY TYLKO DOBRA IDEA?

Technologia informacyjna

Enterprise Java Beans wykład 7 i 8

Wzorce logiki dziedziny

Usługa TimerService

Programowanie komponentowe 5

Programowanie obiektowe

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Podejście obiektowe do relacyjnych baz danych Hibernate.

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Wywoływanie metod zdalnych

Enterprise JavaBeans 3.0

Programowanie w Ruby

Projektowanie bazy danych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

Java: interfejsy i klasy wewnętrzne

Dziedziczenie. dr Jarosław Skaruz

Wykład 7: Pakiety i Interfejsy

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Kurs programowania aplikacji bazodanowych

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

PHP 5 język obiektowy

Kurs WWW. Paweł Rajba.

Monika Kruk Mariusz Grabowski. Informatyka Stosowana WFiIS, AGH 13 grudzień 2006

Bezstanowe komponenty sesyjne i zdarzenia zwrotne

1 Atrybuty i metody klasowe

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

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

Baza danych sql. 1. Wprowadzenie

1 Wprowadzenie do J2EE

Strumienie i serializacja

Programowanie w Internecie. Java

Programowanie obiektowe i zdarzeniowe

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

2. Składnia, środowisko i konwencje w Javie

Serwery aplikacji. dr Radosław Matusik. radmat

Transkrypt:

ORM w Javie Adam Michalik 2007

ORM ORM O/RM O/R mapping Object-Relational Mapping Mapowanie obiektowo relacyjne Odwzorowanie obiektowo-relacyjne

Co to jest ORM? Odwzorowanie obiektowo-relacyjne pozwala przechowywać struktury obiektowe w relacyjnych bazach danych

O czym będziemy rozmawiać Po co nam ORM? Krótko o przydatnych nam elementach Javy (wersja 5+) Adnotacje Serializacja obiektów Trochę o Javie EE Kontener/serwer aplikacji Enterprise JavaBeans (EJB) 3.0 Gwóźdź programu: Java Persistence API

Po co nam ORM? Chcemy przechowywać obiekty w relacyjnej bazie danych. Obiekty: mają atrybuty typy proste (liczby, napisy, daty) referencje do innych obiektów są w hierarchii klas są w relacjach (mają do siebie referencje)

Po co nam ORM? ORM pozwala programiście na przezroczyste posługiwanie się bazą danych w systemach obiektowych: Jedyne, na czym programiście zależy to żeby obiekty, którymi się posługuje, były "trwałe" (ang. persistent). Jeśli robi zmiany, to chce, żeby te zmiany się zachowywały. Programista nie chce zajmować się niskopoziomową obsługą DB - łączeniem z DB, operacjami na relacjach, tabelach, pisaniem zapytań SQL itp. To jest odpowiedzialność ORM managera.

Po co nam ORM? ORM pozwala programiście na przezroczyste posługiwanie się bazą danych w systemach obiektowych: Baza danych automatycznie dostosowuje się do modelu danych - odwzorowywanych klas, atrubutów obiektów, relacji między obiektami. Skoro model obiektowy ma już raz utworzone zależności (w kodzie), to nie ma potrzeby tworzyć tych zależności drugi raz w DB - mogą zostać wygenerowane automatycznie.

Po co nam ORM? ORM pozwala programiście na przezroczyste posługiwanie się bazą danych w systemach obiektowych: ORM manager oraz serwer aplikacji zarządzają optymalizacjami wydajnościowymi (np. pulą połączeń do bazy, cachem obiektów) Programista nie musi wiedzieć, co to za baza ani jakie są jej specyficzne cechy ORM manager przekształca uniwersalny obiektowy język zapytań na SQL, a sterowniki pozwalają mu na obsługę tej konkretnej bazy danych

Java 5+ - adnotacje (annotations) Adnotacje: nowa rodzina obiektów w Javie, koncepcyjnie inna niż klasy i interfejsy metainformacje zapisane na stałe w kodzie wartości muszą być stałe w fazie kompilacji (literały, typy wyliczeniowe) stosowane do: klas, atrybutów, metod używane podczas przetwarzania: plików źródłowych, plików skompilowanych (.class) i obiektów w czasie działania nie wpływają stricte na działanie kodu ale na obsługę obiektów/klas przez inne narzędzia

Java 5+ - adnotacje (annotations) Przykład deklaracji klasy adnotacji @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface RequestForEnhancement { int id(); String synopsis(); String engineer() default "[unassigned]"; String date() default "[unimplemented]"; }

Java 5+ - adnotacje (annotations) Klasa adnotacji deklaruje metody, które muszą zwracać: typy proste (int, char, long, double, boolean...) String obiekt klasy (Class) typy wyliczeniowe (enum) adnotacje tablice powyższych

Java 5+ - adnotacje (annotations) Metody adnotacji: nie mogą rzucać wyjątków nie mogą przyjmować parametrów mogą mieć domyślne wartości (po słowie kluczowym default)

Java 5+ - adnotacje (annotations) Adnotacja marker deklaracja public @interface Preliminary { } użycie @Preliminary public class TimeTravel {... }

Java 5+ - adnotacje (annotations) Adnotacja z pojedynczą wartością deklaracja public @interface Copyright { String value(); } użycie @Copyright("2002 Yoyodyne Propulsion Systems") public class OscillationOverthruster {... }

Java 5+ - adnotacje (annotations) Przykład użycia wszystko na raz : @A1(v1= aaa, v2=123, v3=object.class) public class MyClass { @A2 Object o; @A3( ddd ) public Object geto() { return o; } }

Java 5+ - adnotacje (annotations) Plusy adnotacji: nie mamy osobnego pliku z metainformacjami, który musimy osobno pielęgnować i który może nam się rozspójnić z kodem są w tym samym języku, co kod w wielu przypadkach można zrezygnować z poprzednio stosowanego dziedziczenia po Bardzo Specjalnych Klasach lub implementowania Bardzo Specjalnych Interfejsów i używać zwykłych, adnotowanych obiektów (POJOs Plain Old Java Objects)

Java 5+ - adnotacje (annotations) Minusy adnotacji: żeby zmienić metaiformacje, trzeba przekompilować kod

Java 5+ - adnotacje (annotations) Rozwiązanie: część danych w adnotacjach, część w deskryptorze XML (stałe, statyczne dane w @, zmienne, dynamiczne w XML): deskryptor ma większy priorytet od anotacji daje pewną elastyczność kosztem spójności pozwala osobie składającej aplikację ustawić cechy konfigurowalne, a programiście cechy stałe (np. fakt bycia w relacji 1-1 lub 1-*)

Java serializacja obiektów Java umożliwia zamianę stanu obiektu na ciąg bajtów - serializację. Serializacja jest przydatna gdy: chcemy trwale zapisać obiekt (w pliku, w bazie danych) chcemy przesyłać obiekt przez sieć Żeby obiekt był serializowalny, musi implementować pusty interfejs Serializable.

Java serializacja obiektów Domyślnie serializowany jest cały graf zależności obiekt serializowany i wszystkie jego atrybuty. Ale atrybuty też musza być serializowalne. Jeśli nie chcemy serializować jakiegoś atrybutu, oznaczamy go słowem kluczowym transient: private transient Object myattr; Przy deserializacji ustawiane na domyślną wartość (0, null, false). Możemy sami zakodować ręcznie sposób serializacji private void writeobject(objectoutputstream os) private void readobject(objectinputstream os)

Java serializacja obiektów W metodach readobject i writeobject kodujemy domyślną (de)serializację (defaultwriteobject, defaultreadobject)i ręczne ustawianie atrybutów nieserializowanych Klasy dziedziczące po klasach serializowalnych są serializowalne Klasy serializowalne dziedziczące po klasach nieserializowalnych wołają ich nieprywatny bezargumentowy konstruktor. Jeśli chcemy dodatkowo poustawiać coś w nadklasach, musimy zrobić to ręcznie.

Java serializacja obiektów Serializowane są tylko atrybuty instancji, nigdy klasy (i lepiej tego nie kodować ręcznie)

Java EE Java EE zbiór standardów (API) dla programowania dużych aplikacji biznesowych Różne firmy mają różne implementacje tych API Java Persistence API (JPA) jest częścią Java EE Najczęściej aplikacje biznesowe korzystają z usług serwera aplikacji, który udostępnia dużo ciekawych funkcji. Koduje się pod API, więc można zmieniać producentów serwerów.

Java EE - kontener Kontener to część serwera aplikacji odpowiedzialna za obsługę pewnego rodzaju usług

Java EE (5.0) kontener Kontener udostępnia m.in. usługi: EJB 3.0 JPA JTA JDBC RMI-IIOP Różne usługi dla technologii XML JMS Web Services JavaMail JNDI Java IDL

EJB 3.0 Enterprise JavaBeans EJB logika aplikacji Instancjami EJB zarządza kontener nie tworzymy przez new EJB: Stateless Session Bean Stateful Session Bean Message-driven Bean

EJB 3.0 EJB to para: interfejs + klasa Sens EJB: Kontener tworzy proxy, do którego odwołujemy się przez interfejs Dzięki temu kontener może m.in.: trzymać pulę utworzonych obiektów (oszczędność czasu na konstrukcję/destrukcję i pamięci) zarządzać wątkami i połączeniami przez sieć równoważyć obciążenie na wiele serwerów automatycznie wstrzykiwać zależności zarządzać transakcjami

EJB 3.0

EJB 3.0 vs. EJB 2.1

JPA Obiekty podlegające JPA to encje (entities) Encje nie są niczym szczególnym to zwykłe obiekty (POJO) z pewnymi ograniczeniami Żeby obiekt był encją w rozumieniu JPA: musi być oznaczony jako @Entity musi mieć ID musi mieć publiczny albo chroniony bezargumentowy konstruktor nie może być z klasy 'final' ani mieć 'final' atrybutów

JPA Jakie atrybuty może mieć encja: typy proste i ich wrappery tablice bajtów i znaków oraz ich wrapperów typy serializowalne daty (java.util.date, java.util.calendar...) typy wyliczeniowe (enum) encje kolekcje i mapy powyższych

JPA Prosta encja: @Entity public class Person { @Id private BigInteger pesel; private String name; private String surname; }

JPA Prosta encja: @Entity public class Person { private BigInteger pesel; private String name; private String surname; } @Id public getpesel() { return pesel; } //getters and setters

JPA - dziedziczenie Encje mogą być abstrakcyjne (abstract class) Encje mogę dziedziczyć po encjach i zwykłych klasach Z encji mogą dziedziczyć encje i zwykłe klasy Zwykłe klasy dziedziczące z encji nie są trwałe Jeśli encja dziedziczy ze zwykłej klasy, to może atrybuty z tej klasy: tracić (domyślne zachowanie) adnotacje JPA w nadklasie są nieważne mapować do encji tylko gdy nadklasa jest @MappedSuperclass; adnotacje JPA są ważne

JPA - dziedziczenie Jak zrealizować hierarchię encji w relacyjnej DB? @Inheritance(strategy=InheritanceType.???) SINGLE_TABLE jedna wielka tabela na całą hierarchię klas. Szybka, ale marnuje miejsce. Klasy rozróżniane po dodatkowej kolumnie (discriminator) TABLE_PER_CLASS każda klasa ma swoją tabelę, a w niej całość informacji mało polimorficzne, niska wydajność zapytań do nadklas trzeba użyć UNION JOINED każda klasa ma tabelę tylko ze swoimi polami. Polimorficzne, ale trzeba użyć JOIN

Klucze encji mogą być: JPA - klucze proste (@Id): pojedynczy atrybut encji typu prostego całkowitego, jego wrappera, String lub Date złożone: kilka atrybutów encji lub obiekt Atrybuty kluczy złożonych mają takie same ograniczenia jak typy proste Klucze proste całkowitoliczbowe można generować automatycznie (@GeneratedValue) @Entity public class Employee { @Id @GeneratedValue public Long getid() { return id; }... }

JPA klucze złożone Kluczem złożonym jest obiekt osobnej klasy Klucz złożony można reprezentować w encji jako: referencja do obiektu (@EmbeddedId + klucz @Embeddable) atrybuty klasy klucza (@Id + @IdClass)

JPA klucze złożone Referencja do obiektu @Embeddable public class EmployeePK implements Serializable { private String name; private long id; //... gettery, settery, no-arg konstruktor, equals() i hashcode() } @Entity public class Employee implements Serializable { EmployeePK primarykey; public Employee(){} @EmbeddedId public EmployeePK getprimarykey(){...} public void setprimarykey(employeepk pk){...} }...

JPA klucze złożone Atrybuty klasy klucza public class EmployeePK implements Serializable { private String empname; private Date birthday; //... gettery, settery, no-arg konstruktor, equals() i hashcode() } @IdClass(EmployeePK.class) @Entity public class Employee { @Id String empname; @Id Date birthday;... }

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA jak działa

JPA PersistenceManager PersistenceManager zarządca encji Automatycznie wstrzykiwany przez serwer Programista nie musi się przejmować cache'owaniem, odczytem z bazy, updatem, deletem, zapisem ani transakcjami Programista może budować zapytania w Java Persistence QL, tłumaczone przez PM na SQL

JPA cykl życia encji

JPA - związki Związki między obiektami: 1-1 1-* *-1 *-* Każdy rodzaj związku może być jedno- lub dwukierunkowy Związek ma stronę właściciela (owning) i odwrotną (reverse)

JPA - związki Typowe właściwości związków (parametry adnotacji): cascade jakie operacje wykonywać kaskadowo na związku (wszystkie, zapis do DB, usuwanie, update, odświeżanie) fetch LAZY EAGER mappedby po stronie inverse określenie, który atrybut strony owning wskazuje na dany obiekt. Związki są zawsze mapowane po stronie właściciela. optional czy referencja może być nullem

@OneToOne JPA - związki @Entity public class Customer { //owning... @OneToOne(optional=false) public CustomerRecord getcustomerrecord(){ return customerrecord; }... } @Entity public class CustomerRecord { //owned - inverse... @OneToOne(optional=false, mappedby="customerrecord") public Customer getcustomer() {...}... }

JPA - związki @OneToMany, @ManyToOne @Entity public class Customer {... @OneToMany(cascade=ALL, mappedby="customer") public Set<Order> getorders() { return orders; }... } @Entity public class Customer {... @ManyToOne public Customer getcustomer() { return customer; }... }

JPA - związki @ManyToMany @Entity public class Customer {... @ManyToMany public Set<PhoneNumber> getphones() { return phones; }... } @Entity public class PhoneNumber {... @ManyToMany(mappedBy="phones") public Set<Customer> getcustomers() { return customers; }... }

Java Persistence Query Language Obiektowy język zapytań przekształcany na SQL Przykłady: Wybranie wszystkich graczy SELECT p FROM Player p FROM Player AS p Player nazwa encji p nazwa zmiennej elementu wyniku Anonimowa parametryzacja SELECT DISTINCT p FROM Player p WHERE p.position =?1?1 pierwszy parametr

Java Persistence Query Language Parametry nazwane SELECT DISTINCT p FROM Player p WHERE p.position = :position AND p.name = :name :position, :name parametry, pod które trzeba programistycznie podstawić wartości Gracze, którzy mają drużynę SELECT DISTINCT p FROM Player p, IN(p.teams) t SELECT DISTINCT p FROM Player p JOIN p.teams t SELECT DISTINCT p FROM Player p WHERE p.team IS NOT EMPTY

Java Persistence Query Language Nawigacja w kolekcjach SELECT DISTINCT p FROM Player p, IN (p.teams) AS t WHERE t.city = :city Nie: WHERE p.teams.city = :city Nawigacja w pojedynczych relacjach SELECT DISTINCT p FROM Player p, IN (p.teams) t WHERE t.league.sport = :sport Inne operatory w WHERE LIKE, IS (NOT) NULL, IS EMPTY, BETWEEN, MEMBER OF wiele innych znanych z SQL