260 likes | 443 Views
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
E N D
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
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.
@OneToOne • public @interface OneToOne • { • Class targetEntity( ) default void.class; • CascadeType[] cascade( ) default {}; • FetchType fetch( ) default EAGER; • boolean optional( ) default true; • String mappedBy( ) default ""; • }
@JoinColumn • @Entity • public class Uzytkownik implements Serializable • { • @Id • private int id; • private String imie; • @OneToOne • @JoinColumn(name="adres_id") • private Adres adres; • }
Relacje - OneToOne • @Entity • public class Uzytkownik • { • @Id • private int id; • private String imie; • @OneToOne • @JoinColumn(name=”adres_id") • private Adres adres; • }
Relacje - OneToOne • @Entity • public class Adres • { • @Id • private int id; • private String miasto; • private String ulica; • @OneToOne(mappedBy="adres") • private Uzytkownik uzytkownik; • }
@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
@ManyToMany • public @interface ManyToMany • { • Class targetEntity( ) default void.class; • CascadeType[] cascade( ) default {}; • FetchType fetch( ) default LAZY; • String mappedBy( ) default ""; • }
@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; • }
@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<Dziecko> dzieci; • }
@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
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
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
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>();
Ł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.
Inicjalizacja • public Uzytkownik getUzytkownik(int id) • { • Uzytkownik uzytkownik = this.get(id); • if (uzytkownik != null) • { • Hibernate.initialize(uzytkownik.getProjekt()); • Hibernate.initialize(uzytkownik.getDzieci()); • } • return uzytkownik; • }
@ElementCollection • @ElementCollection • private List<String> slowaKluczowe = new ArrayList<String>();
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;
Przykłady relacji (III) • @ManyToOne • private Uzytkownik uzytkownik; • @OneToMany(mappedBy="uzytkownik") • @OrderBy(clause="identyfikator") • private List<Urzadzenie> urzadzeniaLista = new ArrayList<Urzadzenie>();
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>();
Przykłady relacji (V) • @ManyToMany • Set<Uzytkownik> uzytkownicy = new HashSet<Uzytkownik>(); • @ManyToMany(mappedBy = "uzytkownicy") • private Set<Grupa> grupy = new HashSet<Grupa>();
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>();
Przykłady relacji (VII) • @ManyToMany • List<Umiejetnosc> posiadaneUmiejetnosciLista = new ArrayList<Umiejetnosc>();