2014-09-13 2 views

ответ

23

Допустим, у нас есть объекты, как это:

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

В приведенном выше примере, при получении Parent сущности, спящий режим будет автоматически загружать все child объекты охотно используя присоединиться. С другой стороны, когда вы получаете Child, Parent объект не будет выбран, если вы не назовете его экспликацией в вашем коде child.getParent().

FetchType (Lazy/Eager) указывает, хотим ли мы, чтобы объект загружался с нетерпением или ленивым, когда есть вызов в коде.

FetchMode (Select/Join) указывает, хотим ли мы, чтобы наша правота была загружена с дополнительным выбором или в одном запросе с объединением или подзапросом.

+0

Обнаружили это онлайн. Очень полезно. http://www.solidsyntax.be/2013/10/17/fetching-collections-hibernate/ – Jake

18

FetchMode: Он определяет how спящий режим (с помощью которых стратегии, например, соединения, подзапрос и т.д.) будет извлекать данные из базы данных.

FetchType: Он определяет whether спящий режим будет получать данные или нет.

ПРИМЕЧАНИЕ: FetchMode применимо только при FetchType = EAGER в аннотации.

+8

FetchMode применим не только к FetchType.EAGER. Правила следующие: а) если вы не указали FetchMode, по умолчанию JOIN и FetchType работают нормально, b) если вы явно укажете FetchMode.JOIN, FetchType игнорируется и запрос всегда нетерпелив, c) если вы укажете FetchMode.SELECT или FetchMode.SUBSELECT, FetchType.Type работает нормально. –

+0

@ DawidStępień эта информация очень полезна! – GMsoF

Смежные вопросы