Transcript Hibernate

Odwzorowania relacyjno-obiektowe

Hibernate relacje

Odwzorowania 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 – – Jeden do wielu – – Wiele do jednego – – Wiele do wielu – @OneToOne @OneToMany @ManyToOne @ManyToMany • Kierunkowy podział relacji – Relacja dwukierunkowa – Relacja jednokierunkowa 2

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.

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

Relacje - OneToOne } { @Entity public class Uzytkownik @Id private int id; private String imie; @OneToOne @JoinColumn(name=”adres_id") private Adres adres; Odwzorowania relacyjno-obiektowe 6

Relacje - OneToOne { @Entity public class Adres @Id private int id; private String miasto; private String ulica; } @OneToOne(mappedBy="adres") private Uzytkownik uzytkownik; Odwzorowania relacyjno-obiektowe 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 8

Odwzorowania relacyjno-obiektowe @ManyToMany } { public @interface ManyToMany Class targetEntity( ) default void.class; CascadeType[] cascade( ) default {}; FetchType fetch( ) default LAZY; String mappedBy( ) default ""; 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 projekty; 10

Odwzorowania relacyjno-obiektowe 11 @OrderBy (I) • Kolekcja może zostać uporządkowana według określonych kryteriów • W przypadku kolekcji uporządkowanej wykorzystać należy typ List

@OrderBy (II) } { @Entity public class Uzytkownik @Id private int id; private String name; @OneToMany(mappedBy=”uzytkownik") @OrderBy(”nazwisko") protected List dzieci; Odwzorowania relacyjno-obiektowe 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 13

Odwzorowania relacyjno-obiektowe Operacje kaskadowe • Operacje kaskadowe – Definiowane dla relacji w encjach – Automatyczna propagacja operacji w głąb hierarchii relacji 14 • Oznacza to, że wszystkie operacje na encji mają powodować wykonanie takiej samej operacji dla powiązanych encji

15 Odwzorowania 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

Odwzorowania relacyjno-obiektowe Typy operacji kaskadowych (II) @OneToMany(cascade = CascadeType.ALL) @Cascade(org.hibernate.annotations.CascadeType.

DELETE_ORPHAN

) private List ocenaLista = new ArrayList(); 16 @OneToMany(

orphanRemoval

= true ) private List ocenaLista = new ArrayList();

17 Odwzorowania 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.

Odwzorowania 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; 18

@ElementCollection Odwzorowania relacyjno-obiektowe 19

@ElementCollection

private List slowaKluczowe = new ArrayList();

Odwzorowania relacyjno-obiektowe 20 Przykłady relacji (I) @OneToOne(cascade=CascadeType.ALL) @Cascade(org.hibernate.annotations.CascadeType.

DELETE_ORPHAN) DaneSerwisowe daneSerwisowe = new DaneSerwisowe();

Przykłady relacji (II) @ManyToOne private Dostawca dostawca; Odwzorowania relacyjno-obiektowe 21

Odwzorowania relacyjno-obiektowe 22 Przykłady relacji (III) @ManyToOne private Uzytkownik uzytkownik; @OneToMany(mappedBy="uzytkownik") @OrderBy(clause="identyfikator") private List urzadzeniaLista = new ArrayList();

Odwzorowania relacyjno-obiektowe Przykłady relacji (IV) @ManyToOne Uzytkownik uzytkownik; @OneToMany(mappedBy="uzytkownik” cascade=CascadeType.ALL) @Cascade(org.hibernate.annotations.CascadeType.

DELETE_ORPHAN) private List adresLista = new ArrayList(); 23

Odwzorowania relacyjno-obiektowe Przykłady relacji (V) @ManyToMany Set uzytkownicy = new HashSet(); @ManyToMany(mappedBy = "uzytkownicy") private Set grupy = new HashSet(); 24

Odwzorowania relacyjno-obiektowe Przykłady relacji (VI) @ManyToMany(mappedBy="producentLista", cascade=CascadeType.ALL) private List rodzajSprzetuLista = new ArrayList(); 25 @ManyToMany(cascade=CascadeType.ALL) private List producentLista = new ArrayList();

Przykłady relacji (VII) Odwzorowania relacyjno-obiektowe 26 @ManyToMany List posiadaneUmiejetnosciLista = new ArrayList();