26
Odwzorowania relacyjno- obiektowe Hibernate relacje

Hibernate relacje

Embed Size (px)

DESCRIPTION

Hibernate relacje. 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 - PowerPoint PPT Presentation

Citation preview

Page 1: Hibernate relacje

Odwzorowania relacyjno-obiektowe

Hibernaterelacje

Page 2: Hibernate relacje

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

Page 3: Hibernate relacje

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.

Page 4: Hibernate relacje

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 "";

}

Page 5: Hibernate relacje

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;

}

Page 6: Hibernate relacje

6Odwzorowania relacyjno-obiektowe Relacje - OneToOne

@Entity

public class Uzytkownik

{

@Id

private int id;

private String imie;

@OneToOne

@JoinColumn(name=”adres_id")

private Adres adres;

}

Page 7: Hibernate relacje

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;

}

Page 8: Hibernate relacje

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

Page 9: Hibernate relacje

9Odwzorowania relacyjno-obiektowe @ManyToMany

public @interface ManyToMany{ Class targetEntity( ) default void.class; CascadeType[] cascade( ) default {}; FetchType fetch( ) default LAZY; String mappedBy( ) default "";}

Page 10: Hibernate relacje

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;

}

Page 11: Hibernate relacje

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

Page 12: Hibernate relacje

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;

}

Page 13: Hibernate relacje

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

Page 14: Hibernate relacje

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

Page 15: Hibernate relacje

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

Page 16: Hibernate relacje

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>();

Page 17: Hibernate relacje

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.

Page 18: Hibernate relacje

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;

}

Page 19: Hibernate relacje

19Odwzorowania relacyjno-obiektowe @ElementCollection

@ElementCollection

private List<String> slowaKluczowe = new ArrayList<String>();

Page 20: Hibernate relacje

20Odwzorowania relacyjno-obiektowe Przykłady relacji (I)

@OneToOne(cascade=CascadeType.ALL)

@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)

DaneSerwisowe daneSerwisowe = new DaneSerwisowe();

Page 21: Hibernate relacje

21Odwzorowania relacyjno-obiektowe Przykłady relacji (II)

@ManyToOne

private Dostawca dostawca;

Page 22: Hibernate relacje

22Odwzorowania relacyjno-obiektowe Przykłady relacji (III)

@ManyToOne

private Uzytkownik uzytkownik;

@OneToMany(mappedBy="uzytkownik")

@OrderBy(clause="identyfikator")

private List<Urzadzenie> urzadzeniaLista = new ArrayList<Urzadzenie>();

Page 23: Hibernate relacje

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>();

Page 24: Hibernate relacje

24Odwzorowania relacyjno-obiektowe Przykłady relacji (V)

@ManyToMany

Set<Uzytkownik> uzytkownicy = new HashSet<Uzytkownik>();

@ManyToMany(mappedBy = "uzytkownicy")

private Set<Grupa> grupy = new HashSet<Grupa>();

Page 25: Hibernate relacje

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>();

Page 26: Hibernate relacje

26Odwzorowania relacyjno-obiektowe Przykłady relacji (VII)

@ManyToMany

List<Umiejetnosc> posiadaneUmiejetnosciLista = new ArrayList<Umiejetnosc>();