Suche…


Einführung

Das Abrufen ist in JPA (Java Persistence API) sehr wichtig. In JPA werden HQL (Hibernate Query Language) und JPQL (Java Persistence Query Language) verwendet, um die Entitäten basierend auf ihren Beziehungen abzurufen. Obwohl es viel besser ist, als so viele Verknüpfungsabfragen und Unterabfragen zu verwenden, um mithilfe von nativem SQL zu erhalten, was wir wollen, wirkt sich die Strategie, wie wir die zugehörigen Entitäten in JPA abrufen, immer noch im Wesentlichen auf die Leistung unserer Anwendung aus.

Es wird empfohlen, FetchType.LAZY zu verwenden. Join holt die Spalten, wenn sie benötigt werden.

Nachfolgend finden Sie eine Employer Entity-Klasse, die dem Tabellen-Arbeitgeber zugeordnet ist. Wie Sie sehen, habe ich fetch = FetchType.LAZY anstelle von fetch = FetchType.EAGER verwendet. Der Grund, warum ich LAZY verwende, ist, dass der Arbeitgeber später viele Eigenschaften hat und jedes Mal, wenn ich nicht alle Felder eines Arbeitgebers kennen muss. Daher führt das Laden aller von ihnen zu einer schlechten Leistung, wenn ein Arbeitgeber geladen wird.

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

Für von LAZY abgerufene Assoziationen führen jedoch nicht initialisierte Proxys manchmal zu LazyInitializationException. In diesem Fall können Sie JOIN FETCH einfach in HQL / JPQL verwenden, um LazyInitializationException zu vermeiden.

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow