Wykladh3(relacje).

Download Report

Transcript Wykladh3(relacje).

Odwzorowania relacyjno-obiektowe
Hibernate
relacje
Odwzorowania relacyjno-obiektowe
2
Typy relacji
• Reprezentacja relacji przy pomocy pól typu innej encji, bądź
też kolekcji encji
• Mnogościowy podział relacji
– Jeden do jednego –
@OneToOne
– Jeden do wielu –
@OneToMany
– Wiele do jednego –
@ManyToOne
– Wiele do wielu –
@ManyToMany
• Kierunkowy podział relacji
– Relacja dwukierunkowa
– Relacja jednokierunkowa
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Odwzorowania relacyjno-obiektowe
Relacje dwukierunkowe
• Kierunkowość determinuje możliwość nawigacji między
powiązanymi instancjami klas trwałych. Asocjacja
dwukierunkowa jest definiowana jako para asocjacji
jednokierunkowych, ze wskazaniem jednej z nich jako
głównej.
• W przypadku związku dwukierunkowego konieczne jest
wskazanie właściciela relacji za pomocą elementu
mappedBy
• Dla związków dwukierunkowych trzeba pamiętać, że w celu
powiązania instancji dwóch encji ze sobą należy dokonać
powiązania dla obu stron związku.
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
3
Odwzorowania relacyjno-obiektowe
@OneToOne
public @interface OneToOne
{
Class targetEntity( ) default void.class;
CascadeType[] cascade( ) default {};
FetchType fetch( ) default EAGER;
boolean optional( ) default true;
String mappedBy( ) default "";
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
4
Odwzorowania relacyjno-obiektowe
@JoinColumn
@Entity
public class Uzytkownik implements Serializable
{
@Id
private int id;
private String imie;
@OneToOne
@JoinColumn(name="adres_id")
private Adres adres;
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
5
Odwzorowania relacyjno-obiektowe
Relacje - OneToOne
@Entity
public class Uzytkownik
{
@Id
private int id;
private String imie;
@OneToOne
@JoinColumn(name=”adres_id")
private Adres adres;
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
6
Odwzorowania relacyjno-obiektowe
Relacje - OneToOne
@Entity
public class Adres
{
@Id
private int id;
private String miasto;
private String ulica;
@OneToOne(mappedBy="adres")
private Uzytkownik uzytkownik;
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
7
Odwzorowania relacyjno-obiektowe
@OneToMany
public @interface OneToMany
{
Class targetEntity( ) default void.class;
CascadeType[] cascade( ) default {};
FetchType fetch( ) default LAZY;
String mappedBy( ) default "";
}
Parametr mappedBy– nazwa pola klasy po drugiej stronie
relacji
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
8
Odwzorowania relacyjno-obiektowe
@ManyToMany
public @interface ManyToMany
{
Class targetEntity( ) default void.class;
CascadeType[] cascade( ) default {};
FetchType fetch( ) default LAZY;
String mappedBy( ) default "";
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
9
@ManyToMany - przykład
Odwzorowania relacyjno-obiektowe
@Entity
public class Uzytkownik {
@Id
private int id;
private String imie;
@ManyToMany
@JoinTable(name = ”uzy_proj",
joinColumns = @JoinColumn(name = ”uzytkownik_ID"),
inverseJoinColumns = @JoinColumn(name = ”projekt_ID"))
private Collection<Projekt> projekty;
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
10
Odwzorowania relacyjno-obiektowe
@OrderBy (I)
• Kolekcja może zostać uporządkowana według określonych
kryteriów
• W przypadku kolekcji uporządkowanej wykorzystać należy
typ List
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
11
Odwzorowania relacyjno-obiektowe
@OrderBy (II)
@Entity
public class Uzytkownik
{
@Id
private int id;
private String name;
@OneToMany(mappedBy=”uzytkownik")
@OrderBy(”nazwisko")
protected List<Dziecko> dzieci;
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
12
Odwzorowania relacyjno-obiektowe
@JoinTable
• Parametr name – nazwa tabeli
• Parametr joinColumns – kolumna tabeli złączenia,
stanowiąca klucz dla encji
• Parametr inverseJoinColumns – kolumna tabel złączenia,
stanowiąca klucz dla encji po drugiej stronie relacji
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
13
Odwzorowania relacyjno-obiektowe
Operacje kaskadowe
• Operacje kaskadowe
– Definiowane dla relacji w encjach
– Automatyczna propagacja operacji w głąb hierarchii
relacji
• Oznacza to, że wszystkie operacje na encji mają
powodować wykonanie takiej samej operacji dla
powiązanych encji
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
14
Odwzorowania relacyjno-obiektowe
15
Typy operacji kaskadowych (I)
• CascadeType.PERSIST – włączanie nowej encji do
kontekstu
• CascadeType.MERGE – aktualizacja encji
• CascadeType.REMOVE – usuwanie encji
• CascadeType.REFRESH – odświeżanie stanu encji
z bazy
• CascadeType.DETACH – odłączenie kolekcji
• CascadeType.ALL– wszystkie powyższe
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Odwzorowania relacyjno-obiektowe
Typy operacji kaskadowych (II)
@OneToMany(cascade = CascadeType.ALL)
@Cascade(org.hibernate.annotations.CascadeType.
DELETE_ORPHAN)
private List<Ocena> ocenaLista = new
ArrayList<Ocena>();
@OneToMany( orphanRemoval = true )
private List<Ocena> ocenaLista = new
ArrayList<Ocena>();
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
16
Ładowanie leniwe
Odwzorowania relacyjno-obiektowe
17
• Parametr fetch dla adnotacji relacyjnych
– FetchType.EAGER – pobieranie natychmiastowe –
domyślne dla @OneToOne i @ManyToOne
– FetchType.LAZY – pobieranie opóźnione – domyślne dla
@OneToMany i @ManyToMany
• Opóźnione pobranie encji jest możliwe jedynie, gdy
podstawowa encja jest w stanie managed
• Próba pobrania encji oznaczonej jako LAZY i znajdującej się
w stanie Detached spowoduje wyrzucenie wyjątku.
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Odwzorowania relacyjno-obiektowe
Inicjalizacja
public Uzytkownik getUzytkownik(int id)
{
Uzytkownik uzytkownik = this.get(id);
if (uzytkownik != null)
{
Hibernate.initialize(uzytkownik.getProjekt());
Hibernate.initialize(uzytkownik.getDzieci());
}
return uzytkownik;
}
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
18
Odwzorowania relacyjno-obiektowe
@ElementCollection
@ElementCollection
private List<String> slowaKluczowe =
new ArrayList<String>();
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
19
Przykłady relacji (I)
Odwzorowania relacyjno-obiektowe
@OneToOne(cascade=CascadeType.ALL)
@Cascade(org.hibernate.annotations.CascadeType.
DELETE_ORPHAN)
DaneSerwisowe daneSerwisowe = new
DaneSerwisowe();
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
20
Przykłady relacji (II)
Odwzorowania relacyjno-obiektowe
@ManyToOne
private Dostawca dostawca;
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
21
Przykłady relacji (III)
Odwzorowania relacyjno-obiektowe
@ManyToOne
private Uzytkownik uzytkownik;
@OneToMany(mappedBy="uzytkownik")
@OrderBy(clause="identyfikator")
private List<Urzadzenie> urzadzeniaLista = new
ArrayList<Urzadzenie>();
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
22
Przykłady relacji (IV)
Odwzorowania relacyjno-obiektowe
@ManyToOne
Uzytkownik uzytkownik;
@OneToMany(mappedBy="uzytkownik”
cascade=CascadeType.ALL)
@Cascade(org.hibernate.annotations.CascadeType.
DELETE_ORPHAN)
private List<Adres> adresLista = new
ArrayList<Adres>();
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
23
Przykłady relacji (V)
Odwzorowania relacyjno-obiektowe
24
@ManyToMany
Set<Uzytkownik> uzytkownicy = new
HashSet<Uzytkownik>();
@ManyToMany(mappedBy = "uzytkownicy")
private Set<Grupa> grupy = new HashSet<Grupa>();
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Przykłady relacji (VI)
Odwzorowania relacyjno-obiektowe
@ManyToMany(mappedBy="producentLista",
cascade=CascadeType.ALL)
private List<RodzajSprzetu> rodzajSprzetuLista =
new ArrayList<RodzajSprzetu>();
@ManyToMany(cascade=CascadeType.ALL)
private List<Producent> producentLista = new
ArrayList<Producent>();
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
25
Przykłady relacji (VII)
Odwzorowania relacyjno-obiektowe
@ManyToMany
List<Umiejetnosc> posiadaneUmiejetnosciLista =
new ArrayList<Umiejetnosc>();
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
26