2014-09-13 7 views

Odpowiedz

23

Powiedzmy mamy podmioty tak:

@Entity 
@Table 
public class Parent { 
    @Id 
    private Long id; 

    @OneToMany(mappedBy="parent", fetch = FetchType.EAGER) 
    @Fetch(FetchMode.JOIN) 
    private List<Child> child;  
    //getter setters 
} 


@Entity 
@Table 
public class Child {  
    @Id 
    private Long id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    private Parent parent; 

    //getter setter 
} 

W powyższym przykładzie, gdy coraz Parent podmiot, hibernacja będzie automatycznie załadować wszystkie child podmioty skwapliwie korzystając przyłączyć. Z drugiej strony, po pobraniu Child, Parent jednostka nie będzie selektowana, chyba że nazwiesz ją explicity w kodzie child.getParent().

FetchType (Lazy/Eager) mówi, czy chcemy, aby encja była ładowana z zapałem lub leniwym, gdy jest połączenie w kodzie.

FetchMode (Wybierz/dołącz) mówi, czy chcemy, aby nasze uprawnienie do obciążenia zostało dodane z dodatkowym wyborem lub w jednym zapytaniu z łączeniem lub podselekcją.

+0

Znaleziono tego online. Bardzo pomocne. http://www.solidsyntax.be/2013/10/17/fetching-collections-hibernate/ – Jake

18

FetchMode: To określa how hibernacji (za pomocą którego strategii, na przykład przyłączyć, Podkwerenda etc.) będą pobierane dane z bazy danych.

FetchType: Definiuje whether hibernacji będzie pobierał dane czy nie.

UWAGA: FetchMode ma zastosowanie tylko wtedy, gdy FetchType = EAGER podczas adnotacji.

+8

FetchMode ma zastosowanie nie tylko w FetchType.EAGER. Reguły są następujące: a) jeśli nie określisz FetchMode, domyślnie JOIN i FetchType działa normalnie, b) jeśli jawnie określisz FetchMode.JOIN, FetchType zostanie zignorowane, a zapytanie zawsze będzie chętne, c) jeśli określisz FetchMode.SELECT lub FetchMode.SUBSELECT, FetchType.Type działa normalnie. –

+0

@ DawidStępień ta informacja jest bardzo pomocna! – GMsoF