Szukaj…


Wprowadzenie

Pobieranie jest bardzo ważne w JPA (Java Persistence API). W JPA, HQL (Hibernate Query Language) i JPQL (Java Persistence Query Language) są używane do pobierania encji na podstawie ich relacji. Chociaż jest to o wiele lepsze niż używanie tylu zapytań łączących i pod-zapytań, aby uzyskać to, czego chcemy, używając natywnego SQL, strategia, w jaki sposób pobieramy powiązane jednostki w JPA, nadal zasadniczo wpływa na wydajność naszej aplikacji.

Zalecane jest użycie FetchType.LAZY. Dołącz, aby pobrać kolumny, gdy są potrzebne.

Poniżej znajduje się klasa encji Pracodawca, która jest odwzorowana na tabelę pracodawca. Jak widać, użyłem fetch = FetchType.LAZY zamiast fetch = FetchType.EAGER. Powodem, dla którego używam LAZY jest to, że Pracodawca może mieć później wiele właściwości i za każdym razem nie muszę znać wszystkich pól Pracodawcy, więc załadowanie ich wszystkich spowoduje pogorszenie wydajności, a następnie zostanie załadowany pracodawca.

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

Jednak w przypadku LAZY skojarzonych skojarzeń niezainicjowane proxy często prowadzą do wyjątku LazyInitializationException. W takim przypadku możemy po prostu użyć JOIN FETCH w HQL / JPQL, aby uniknąć 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow