2014-09-13 26 views

Antwort

23

Lasst uns sagen, dass wir Entitäten wie dieses:

@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 
} 

Im obigen Beispiel, wenn Parent Einheit bekommen, Ruhezustand wird mit beitreten automatisch eifrig alle child Entitäten laden. Auf der anderen Seite, wenn Sie Child, Parent Entity abrufen wird nicht ausgewählt werden, es sei denn Sie nennen es explizit in Ihrem Code child.getParent().

FetchType (Lazy/Eager) gibt an, ob die Entity eifrig oder faul geladen werden soll, wenn Code aufgerufen wird.

FetchMode (Select/Join) gibt an, ob unsere Entität mit zusätzlichen Select- oder in einer Abfrage mit Join oder Subselect geladen werden soll.

+0

Dies online gefunden. Sehr hilfreich. http://www.solidsyntax.be/2013/10/17/fetching-collections-hibernate/ – Jake

18

FetchMode: Es definiert how Hibernate (mit welcher Strategie, zum Beispiel Join, SubQuery usw.) werden Daten aus der Datenbank abgerufen werden.

FetchType: Er definiert whether Ruhezustand werden die Daten holen oder nicht.

HINWEIS: FetchMode ist nur anwendbar, wenn FetchType = EAGER während Annotation.

+8

FetchMode ist nicht nur mit FetchType.EAGER anwendbar. Die Regeln lauten wie folgt: a) Wenn Sie FetchMode nicht angeben, ist der Standardwert JOIN und FetchType normal. B) Wenn Sie FetchMode.JOIN explizit angeben, wird FetchType ignoriert und eine Abfrage ist immer eifrig. C) wenn Sie angeben FetchMode.SELECT oder FetchMode.SUBSELECT, FetchType.Type funktioniert normal. –

+0

@ DawidStępień diese Info ist sehr hilfreich! – GMsoF