Download - Hibernate relacje
Odwzorowania relacyjno-obiektowe
Hibernaterelacje
2Odwzorowania relacyjno-obiektowe 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
3Odwzorowania 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.
4Odwzorowania 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 "";
}
5Odwzorowania relacyjno-obiektowe @JoinColumn
@Entity
public class Uzytkownik implements Serializable
{
@Id
private int id;
private String imie;
@OneToOne
@JoinColumn(name="adres_id")
private Adres adres;
}
6Odwzorowania relacyjno-obiektowe Relacje - OneToOne
@Entity
public class Uzytkownik
{
@Id
private int id;
private String imie;
@OneToOne
@JoinColumn(name=”adres_id")
private Adres adres;
}
7Odwzorowania relacyjno-obiektowe Relacje - OneToOne
@Entity
public class Adres
{
@Id
private int id;
private String miasto;
private String ulica;
@OneToOne(mappedBy="adres")
private Uzytkownik uzytkownik;
}
8Odwzorowania 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
9Odwzorowania relacyjno-obiektowe @ManyToMany
public @interface ManyToMany{ Class targetEntity( ) default void.class; CascadeType[] cascade( ) default {}; FetchType fetch( ) default LAZY; String mappedBy( ) default "";}
10Odwzorowania relacyjno-obiektowe @ManyToMany - przykład
@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;
}
11Odwzorowania 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
12Odwzorowania relacyjno-obiektowe @OrderBy (II)
@Entity
public class Uzytkownik
{
@Id
private int id;
private String name;
@OneToMany(mappedBy=”uzytkownik")
@OrderBy(”nazwisko")
protected List<Dziecko> dzieci;
}
13Odwzorowania 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
14Odwzorowania 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
15Odwzorowania relacyjno-obiektowe 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
16Odwzorowania 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>();
17Odwzorowania relacyjno-obiektowe Ładowanie leniwe
• 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.
18Odwzorowania relacyjno-obiektowe Inicjalizacja
public Uzytkownik getUzytkownik(int id)
{
Uzytkownik uzytkownik = this.get(id);
if (uzytkownik != null)
{
HibernateTemplate.initialize(uzytkownik.getProjekt());
HibernateTemplate.initialize(uzytkownik.getDzieci());
}
return uzytkownik;
}
19Odwzorowania relacyjno-obiektowe @ElementCollection
@ElementCollection
private List<String> slowaKluczowe = new ArrayList<String>();
20Odwzorowania relacyjno-obiektowe Przykłady relacji (I)
@OneToOne(cascade=CascadeType.ALL)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
DaneSerwisowe daneSerwisowe = new DaneSerwisowe();
21Odwzorowania relacyjno-obiektowe Przykłady relacji (II)
@ManyToOne
private Dostawca dostawca;
22Odwzorowania relacyjno-obiektowe Przykłady relacji (III)
@ManyToOne
private Uzytkownik uzytkownik;
@OneToMany(mappedBy="uzytkownik")
@OrderBy(clause="identyfikator")
private List<Urzadzenie> urzadzeniaLista = new ArrayList<Urzadzenie>();
23Odwzorowania relacyjno-obiektowe Przykłady relacji (IV)
@ManyToOne
Uzytkownik uzytkownik;
@OneToMany(mappedBy="uzytkownik” cascade=CascadeType.ALL)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private List<Adres> adresLista = new ArrayList<Adres>();
24Odwzorowania relacyjno-obiektowe Przykłady relacji (V)
@ManyToMany
Set<Uzytkownik> uzytkownicy = new HashSet<Uzytkownik>();
@ManyToMany(mappedBy = "uzytkownicy")
private Set<Grupa> grupy = new HashSet<Grupa>();
25Odwzorowania relacyjno-obiektowe Przykłady relacji (VI)
@ManyToMany(mappedBy="producentLista", cascade=CascadeType.ALL)
private List<RodzajSprzetu> rodzajSprzetuLista = new ArrayList<RodzajSprzetu>();
@ManyToMany(cascade=CascadeType.ALL)
private List<Producent> producentLista = new ArrayList<Producent>();
26Odwzorowania relacyjno-obiektowe Przykłady relacji (VII)
@ManyToMany
List<Umiejetnosc> posiadaneUmiejetnosciLista = new ArrayList<Umiejetnosc>();