В чем разница в определении lazy = "true" и использовании fetch = "select" or "join"? какой из них предпочтительнее другого?
С уважением
Джаендра
Ответ 1
Скажем, у нас есть такие сущности:
@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) указывает, хотим ли мы, чтобы наша правота была загружена с дополнительным выбором или в одном запросе с объединением или подзапросом.
Ответ 2
FetchMode. Он определяет how спящий режим (с использованием какой стратегии, например, Join, SubQuery и т.д.) будет извлекать данные из базы данных.
FetchType. Он определяет whether. Спящий режим будет извлекать данные или нет.
ПРИМЕЧАНИЕ: FetchMode применимо только при FetchType = EAGER при аннотации.