hibernate
Извлечение в спящий режим
Поиск…
Вступление
Извлечение действительно важно в JPA (Java Persistence API). В JPA для извлечения сущностей на основе их отношений используются HQL (язык запросов Hibernate) и JPQL (Java Query Language Query Language). Хотя это гораздо лучше, чем использование так много присоединяющихся запросов и подзапросов, чтобы получить то, что мы хотим, используя собственный SQL, стратегия, как мы получаем ассоциированные объекты в JPA, по-прежнему существенно влияет на производительность нашего приложения.
Рекомендуется использовать FetchType.LAZY. Присоедините выборку столбцов, когда они понадобятся.
Ниже представлен класс сущностей Employer, который сопоставляется с работодателем таблицы. Как вы видите, я использовал fetch = FetchType.LAZY вместо fetch = FetchType.EAGER. Причина, по которой я использую LAZY, заключается в том, что у Работодателя может быть много свойств позже, и каждый раз, когда мне может не понадобиться знать все поля Работодателя, поэтому загрузка всех из них приведет к плохой производительности, тогда загружается работодатель.
@Entity
@Table(name = "employer")
public class Employer
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String Name;
@OneToMany(mappedBy = "employer", fetch = FetchType.LAZY,
cascade = { CascadeType.ALL }, orphanRemoval = true)
private List<Employee> employees;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
Тем не менее, для ассоциаций LAZY, неинициализированные прокси иногда приводят к исключению LazyInitializationException. В этом случае мы можем просто использовать JOIN FETCH в HQL / JPQL, чтобы избежать LazyInitializationException.
SELECT Employer employer FROM Employer
LEFT JOIN FETCH employer.name
LEFT JOIN FETCH employer.employee employee
LEFT JOIN FETCH employee.name
LEFT JOIN FETCH employer.address