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

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

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

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

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

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Enterprise JavaBeans

Tworzenie tabel. Bazy danych - laboratorium, Hanna Kleban 1

ORM w Javie. Adam Michalik 2007

Hibernate. 1. Wprowadzenie. 2. Uruchomienie dostarczonego przykładu. 3. Własny przykład.

JPA Java Persistance API

Modelowanie obiektowe

Metody dostępu do danych

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

Dziedziczenie i język EJB QL

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

Stanowe komponenty sesyjne

Autor: Joanna Karwowska

Wprowadzenie do projektowania i wykorzystania baz danych Relacje

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

Podstawowe wykorzystanie Hibernate

Bazy danych tworzenie aplikacji bazodanowych ORM / JPA

Wykład IV Modelowanie danych, projektowanie systemu informatycznego Modelowanie konceptualne implementacyjne Modelowanie pojęciowe na encjach

PODSTAWY BAZ DANYCH. 5. Modelowanie danych. 2009/ Notatki do wykładu "Podstawy baz danych"

Bezstanowe komponenty sesyjne i zdarzenia zwrotne

Informacje wstępne Autor Zofia Kruczkiewicz Wzorce oprogramowania 4

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

Podejście obiektowe do relacyjnych baz danych Hibernate.

Paweł Rajba

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

Bazy danych Ćwiczenia projektowe

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

Java EE: JSF + EJB + JPA

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

1. Model ACID. 2. Deklaratywne zarządzanie transakcjami, atrybuty transakcji. 3. Propagacja transakcji. transakcje rozproszone, propagacja kontekstu

Język SQL. Rozdział 9. Język definiowania danych DDL, część 2.

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

Zaawansowane aplikacje internetowe - laboratorium

Zaawansowane Techniki Bazodanowe

Paweł Cieśla. Dokumentacja projektu

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

Bazy danych Ćwiczenia projektowe

Gdzie jest moja tabela?

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

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Programowanie wielowarstwowe i komponentowe

SELECT * FROM tabela WHERE warunek wybiera dane spełniające podany warunek

SIECI KOMPUTEROWE I BAZY DANYCH

Projektowanie Aplikacji Internetowych Jarosław Kuchta. Wzorce projektowe warstwy biznesowej

Przykładowa baza danych BIBLIOTEKA

Wzorce logiki dziedziny

NHibernate. Narzędzie mapowania obiektowo - relacyjnego

Tworzenie modelu logicznego i fizycznego danych.

Instytut Mechaniki i Inżynierii Obliczeniowej fb.com/groups/bazydanychmt/

Wprowadzenie do Doctrine ORM

Komponenty sterowane komunikatami

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

Programowanie w Ruby

Język SQL, zajęcia nr 2

Projektowanie aplikacji z bazami danych

1 Zaznacz poprawne stwierdzenia dotyczące grup plików (filegroup) możemy określić do której grupy plików trafi

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678');

ACESS- zadania z wykorzystaniem poleceń SQL

DB2 XML Extender. Opracowane na podstawie dokumentacji IBM XML Extender

Java EE: JSF + EJB + JPA + CDI + BV

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

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

Języki i metody programowania Java. Wykład 2 (część 2)

Modelowanie wymiarów

Bazy danych - Materiały do laboratoriów VIII

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

Projektowanie aplikacji z bazami danych

Java Persistence API - zagadnienia zaawansowane

Obiektowe bazy danych

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

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

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

Wprowadzenie do języka T-SQL. Michał Bleja

Remote Method Invocation 17 listopada 2010

Programowanie komponentowe

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

Usługa TimerService

Wzorce dystrybucji i wspólbieżności autonomicznej

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Projektowanie Aplikacji Rozproszonych Jarosław Kuchta. Wzorce projektowe warstwy danych

SQL/MySQL. Rafał Kern

Podejście obiektowe do budowy systemów rozproszonych

Kurs programowania aplikacji bazodanowych

Projektowanie obiektowe oprogramowania Wykład 9 Wzorce architektury aplikacji (1) Wiktor Zychla 2013

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

Projekt dziennika lekcyjnego

D D L S Q L. Co to jest DDL SQL i jakie s jego ą podstawowe polecenia?

Modelowanie związków encji

Wykład 6. SQL praca z tabelami 3

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Bartosz Jachnik - Kino

Enterprise JavaBeans 3.0

Bazy danych Ćwiczenia z SQL

Instrukcja CREATE TABLE

Transkrypt:

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

2 Relacje Modelowanie pojęć biznesowych wymaga łączenia komponentów encyjnych w relacje. Specyfikacja JEE określa siedem rodzajów relacji: jeden-do-jednego (oneto-one), jeden-do-wielu (one-to-many), wiele-do-jednego (many-to-one) oraz wieledo-wielu (many-to-many). Relacja może mieć charakter jednokierunkowy (unidirectional) lub dwukierunkowy (bidirectional).

Jednokierunkowa relacja jeden-do-jednego CUSTOMER FIRST_NAME LAST_NAME ADDRES_ 1 1 ADDRESS STREET CITY ZIP @Entity public class Customer implements java.io.serializable { private Address address; @OneToOne(cascade={CascadeType.ALL) @JoinColumn(name="ADDRESS_") public Address getaddress( ) { return homeaddress; 3

4 Jednokierunkowa relacja jeden-do-jednego <entity-mappings> <entity class="com.titan.domain.customer" access="property"> <attributes> <id name="id"> <generated-value/> </id> <one-to-one name="address" targetentity="com.titan.domain.address" fetch="lazy" optional="true"> <cascade>all</cascade> <join-column name="address_"/> </one-to-one> </attributes> </entity> </entity-mappings>

5 Złączenie wg. klucza głównego @OneToOne @PrimaryKeyJoinColumn(cascade={CascadeType.ALL) public Address getaddress( ) { return homeaddress; Kontener automatycznie zmodyfikuje tabelę CUSTOMER: CREATE TABLE CUSTOMER( INT PRIMARY KEY NOT NULL, address_id INT, ) ALTER TABLE CUSTOMER ADD CONSTRAINT customerrefaddress FOREIGN KEY (address_id) REFERENCES ADDRESS (id);

6 Dwukierunkowa relacja jeden-do-jednego CUSTOMER FIRST_NAME LAST_NAME CREDIT_CARD_ 1 1 CREDIT_CARD NUMBER EXP_DATE Relacja dwukierunkowa polega na tym, ze jeden obiekt (encja) otrzymuje referencję do drugiego obiektu (encji) oraz drugi obiekt posiada referencję do pierwszego. Relacje dwukierunkowe są odwzorowane w relacyjnym modelu danych identycznie jak relacje jednokierunkowe.

@Entity public class Customer implements java.io.serializable { private CreditCard creditcard; @OneToOne(cascade={CascadeType.ALL) @JoinColumn(name="CREDIT_CARD_") public CreditCard getcreditcard( ) { return creditcard; 7 Dwukierunkowa relacja jeden-do-jednego @Entity public class CreditCard implements java.io.serializable { private Customer customer; // nazwa atrybutu w klasie Customer, którego dotyczy mapowanie @OneToOne(mappedBy="creditCard") public Customer getcustomer( ) { return this.customer; Klasa Customer nie ulega zmianie w porównaniu z relacją jednokierunkową

8 Dwukierunkowa relacja jeden-do-jednego Przykład programu wiążącego encje Customer oraz CreditCard: Customer cust = new Customer( ); CreditCard card = new CreditCard( ); cust.setcreditcard(card); card.setcustomer(cust); entitymanager.persist(cust); Ponieważ w adnotacji OneToOne encji Customer ustawiliśmy atrybut cascade={cascadetype.all odpowiedni wpis w tabeli CREDIT_CARD zostanie utworzony automatycznie.

Strona właścicielska i przeciwna Ustawione w powyższy sposób odwzorowanie określa, że obiekt Customer jest stroną właścicielską (owning side) natomiast CreditCard stroną przeciwną (inverse side). Poprawna zmiana właściciela karty kredytowej musi odbywać się następująco: Customer newcust = em.find(customer.class, newcustid); CreditCard card = oldcustomer.getcreditcard( ); oldcustomer.setcreditcard(null); newcust.setcreditcard(card); natomiast jej usunięcie jest realizowane przez: Customer cust = em.find(customer.class, id); em.remove(cust.getcreditcard( )); cust.setcreditcard(null); 9

10 Dwukierunkowa relacja jeden-do-jednego <entity-mappings> <entity class="com.titan.domain.customer" access="property"> </entity> <entity class="com.titan.domain.creditcard" access="property"> <attributes> <id name="id"> <generated-value/> </id> <one-to-one name="customer" target-entity="com.titan.domain.customer" mapped-by="creditcard"/> </attributes> </entity> </entity-mappings>

@Entity public class Customer implements java.io.serializable { private Collection<Phone> phonenumbers = new ArrayList<Phone>( ); @OneToMany(cascade={CascadeType.ALL) @JoinColumn(name="CUSTOMER_") public Collection<Phone> getphonenumbers( ) { return phonenumbers; 11 Jednokierunkowa relacja jeden-do-wielu CUSTOMER FIRST_NAME LAST_NAME 1 N PHONE NUMBER TYPE CUSTOMER_

12 Jednokierunkowa relacja jeden-do-wielu Obsługa encji jest analogiczna jak w przypadku jednokierunkowej relacji jeden-dojednego. Customer cust = entitymanager.find(customer.class, pk); Phone phone = new Phone("123-456-7890"); // dodanie telefonu cust.getphones( ).add(phone); // usunięcie telefonu cust.getphones( ).remove(phone); entitymanager.remove(phone);

13 Jednokierunkowa relacja jeden-do-wielu <entity-mappings> <entity class="com.titan.domain.customer" access="property"> <attributes> <id name="id"> <generated-value/> </id> <one-to-many name="phones" targetentity="com.titan.domain.phone"> <cascade-all/> <join-column name="customer_"/> </one-to-many> </attributes> </entity> </entity-mappings>

@Entity public class Customer implements java.io.serializable { private Collection<Phone> phones; @OneToMany(cascade={CascadeType.ALL) @JoinTable(name="CUSTOMER_PHONE"), joincolumns={@joincolumn(name="customer_"), inversejoincolumns={@joincolumn(name="phone_")) public Collection<Phone> getphonenumbers( ) { return phones; 14 Relacja z wykorzystaniem tabeli złączenia CUSTOMER FIRST_NAME LAST_NAME CUSTOMER_PHONE 1 N N 1 CUSTOMER_ PHONE_ PHONE NUMBER TYPE

15 Relacja z wykorzystaniem tabeli złączenia <entity-mappings> <entity class="com.titan.domain.customer" access="property"> <attributes> <id name="id"> <generated-value/> </id> <one-to-many name="phones" targetentity="com.titan.domain.phone"> <cascade-all/> <join-table name="customer_phone"> <join-column name="customer_"/> <inverse-join-column name="phone_"/> </join-table> </one-to-many> </attributes> </entity> </entity-mappings>

16 Jednokierunkowa relacja wiele-do-jednego CRUISE NAME SHIP_ N 1 SHIP NAME @Entity public class Cruise implements java.io.serializable { private Ship ship; @ManyToOne @JoinColumn(name="SHIP_") public Ship getship( ) { return ship;

17 Jednokierunkowa relacja wiele-do-jednego <entity-mappings> <entity class="com.titan.domain.cruise" access="property"> <attributes> <id name="id"> <generated-value/> </id> <many-to-one name="ship" target-entity="com.titan.domain.ship" fetch="eager"> <join-column name="ship_"/> </many-to-one> </attributes> </entity> </entity-mappings>

18 Dwukierunkowa relacja jeden-do-wielu CRUISE NAME SHIP_ 1 N RESERVATION AMOUNT_PA CRUISE_ Analogicznie jak w poprzednim wypadku relacja dwukierunkowa jest wykorzystywana gdy obie encje muszą wiedzieć o sobie nawzajem. W modelu programistycznym odpowiednie adnotacje są dodane do definicji obu klas. Zgodnie ze specyfikacją JPA stroną właścicielską jest komponent naprzeciwko encji z licznością równą jeden. W naszym przypadku to Reservation.

@Entity public class Cruise implements java.io.serializable { private Collection<Reservation> reservations = new ArrayList<Reservation>( ); @OneToMany(mappedBy="cruise") public Collection<Reservation> getreservations( ) { return reservations; 19 Dwukierunkowa relacja jeden-do-wielu @Entity public class Reservation implements java.io.serializable { private Cruise cruise; @ManyToOne @JoinColumn(name="CRUISE_") public Cruise getcruise( ) { return cruise;

Dwukierunkowa relacja jeden-do-wielu <entity-mappings> <entity class="com.titan.domain.cruise" access="property"> <attributes> <id name="id"><generated-value/></id> <one-to-many name="ship" target-entity="com.titan.domain.reservation" fetch="lazy" mapped-by="cruise"> </one-to-many> </attributes> </entity> <entity class="com.titan.domain.reservation" access="property"> <attributes> <id name="id"><generated-value/></id> <many-to-one name="cruise" target-entity="com.titan.domain.cruise" fetch="eager"> <join-column name="cruise_"/> </many-to-one> </attributes> </entity> </entity-mappings> 20

21 Dwukierunkowa relacja wiele-do-wielu CUSTOMER FIRST_NAME LAST_NAME CUSTOMER_RESERVATION CUSTOMER_ RESERVATION_ RESERVATION AMOUNT_PA Relacja wiele-do-wielu w relacyjnym modelu danych odwzorowana z wykorzystaniem tabeli złączenia

@Entity public class Customer implements java.io.serializable { private Collection<Reservation> reservations = new ArrayList<Reservation>( ); @ManyToMany(mappedBy="customers") public Collection<Reservation> getreservations( ) { return reservations; 22 Dwukierunkowa relacja wiele-do-wielu @Entity public class Reservation implements java.io.serializable { private Set<Customer> customers = new HashSet<Customer>( ); @ManyToMany @JoinTable(name="RESERVATION_CUSTOMER"), joincolumns={@joincolumn(name="reservation_"), inversejoincolumns={@joincolumn(name="customer_")) public Set<Customer> getcustomers( ) { return customers;

Dwukierunkowa relacja wiele-do-wielu <entity-mappings> <entity class="com.titan.domain.reservation" access="property"> <attributes><id name="id"><generated-value/></id> <many-to-many name="customers" target-entity="com.titan.domain.customer" fetch="lazy"> <join-table name="reservation_customer"> <join-column name="reservation_"/> <inverse-join-column name="customer_"/> </join-table> </many-to-many> </attributes> </entity> <entity class="com.titan.domain.customer" access="property"> <attributes><id name="id"><generated-value/></id> <many-to-many name="cruise" target-entity="com.titan.domain.reservation" fetch="lazy" mapped-by="customers"> </many-to-many> </attributes> </entity> </entity-mappings> 23

24 Jednokierunkowa relacja wiele-do-wielu CABIN NAME DECK CABIN_RESERVATION CABIN_ RESERVATION_ RESERVATION AMOUNT_PA @Entity public class Reservation implements java.io.serializable { @ManyToMany @JoinTable(name="CABIN_RESERVATION", joincolumns={@joincolumn(name="reservation_"), inversejoincolumns={@joincolumn(name="cabin_")) public Set<Cabin> getcabins( ) { return cabins;

25 Jednokierunkowa relacja wiele-do-wielu <entity-mappings> <entity class="com.titan.domain.reservation" access="property"> <attributes> <id name="id"> <generated-value/> </id> <many-to-many name="cabins" target-entity="com.titan.domain.cabin" fetch="lazy"> <join-table name="cabin_reservation"> <join-column name="reservation_"/> <inverse-join-column name="cabin_"/> </join-table> </many-to-many> </attributes> </entity> </entity-mappings>

26 Relacje reprezentowane przez kolekcje JPA umożliwia stosowanie następujących kolekcji do reprezentowania relacji jedendo-wielu i wiele-do-wielu: java.util.collection, java.util.set, java.util.list i java.util.map. private List<Customer> customers = new ArrayList<Customer>( ); @ManyToMany @OrderBy("lastName ASC") @JoinTable(name="RESERVATION_CUSTOMER"), joincolumns={@joincolumn(name="reservation_"), inversejoincolumns={@joincolumn(name="customer_")) public List<Customer> getcustomers( ) { return customers;

<many-to-many name="customers" target-entity="com.titan.domain.customer" fetch="lazy"> <order-by>lastname ASC</order-by> <join-table name="reservation_customer"> <join-column name="reservation_"/> <inverse-join-column name="customer_"/> </join-table> </many-to-many> 27 Relacje reprezentowane przez kolekcje JPA umożliwia stosowanie następujących kolekcji do reprezentowania relacji jedendo-wielu i wiele-do-wielu: java.util.collection, java.util.set, java.util.list i java.util.map. @ManyToMany @OrderBy("lastName ASC") @JoinTable(name="RESERVATION_CUSTOMER"), joincolumns={@joincolumn(name="reservation_"), inversejoincolumns={@joincolumn(name="customer_")) public List<Customer> getcustomers( ) { return customers;

28 java.util.map @OneToMany(cascade={CascadeType.ALL) @JoinColumn(name="CUSTOMER_") @MapKey(name="number") public Map<String, Phone> getphonenumbers( ) { return phonenumbers; <one-to-many name="phonenumbers" target-entity="com.titan.domain.phone" fetch="lazy"> <cascade-all/> <map-key name="number"/> <join-column name="customer_"/> </one-to-many>

29 Podsumowanie JEE w ramach odwzorowania relacyjno-obiektowego umożliwia korzystanie z siedmiu typów relacji. Odwzorowanie jest określone poprzez mechanizm adnotacji lub konfigurację zapisaną w pliku persistance.xml. Aby modelować relacje obejmujące wiele obiektów możemy korzystać z czterech podstawowych typów kolekcji.