Поиск…


Вступление

Извлечение действительно важно в 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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow