Der Hauptunterschied zwischen den Anmerkungen besteht darin, dass @OneToMany
eine reine JPA-Annotation ist. Wobei @LazyCollection
Hibernate-spezifisch ist.
Wenn Sie möchten, dass Ihr Code über verschiedene JPA-Anbieter hinweg portierbar ist, sollten Sie JPA-Anmerkungen verwenden.
aktualisieren
zwischen diesen beiden Anmerkung Um zu erklären, betrachten die OneToMany
Beziehung zwischen Department -> Employee
Fall 1:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@JoinColumn(name = "DEPARTMENT_ID")
private List<Employee> employees = new ArrayList<>();
wenn Sie holen ein Department
Objekt aus der db mit :
entityManager.find(Department.class, 1L);
wird folgende Abfrage gebrannt, um die Daten zu holen
SELECT department0_.DEPARTMENT_ID AS DEPARTMENT_ID1_0_0_,
department0_.DEPARTMENT_NAME AS DEPARTMENT_NAME2_0_0_,
department0_.LOCATION AS LOCATION3_0_0_,
employees1_.DEPARTMENT_ID AS DEPARTMENT_ID3_1_1_,
employees1_.EMPLOYEE_ID AS EMPLOYEE_ID1_1_1_,
employees1_.EMPLOYEE_ID AS EMPLOYEE_ID1_1_2_,
employees1_.DEPARTMENT_ID AS DEPARTMENT_ID3_1_2_,
employees1_.EMPLOYEE_NAME AS EMPLOYEE_NAME2_1_2_
FROM DEPARTMENT department0_
LEFT OUTER JOIN EMPLOYEE employees1_
ON department0_.DEPARTMENT_ID =employees1_.DEPARTMENT_ID
WHERE department0_.DEPARTMENT_ID=?
so bedeutet es, sie auf einmal alle Daten in einer einzigen Abfrage holen wird.
Fall 2:
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "DEPARTMENT_ID")
private List<Employee> employees = new ArrayList<>();
identisch wie wenn Sie eine Abteilung Objekt aus der db holen mit:
entityManager.find(Department.class, 1L);
folgenden Abfragen, die Daten zu holen gefeuert wird:
SELECT department0_.DEPARTMENT_ID AS DEPARTMENT_ID1_0_0_,
department0_.DEPARTMENT_NAME AS DEPARTMENT_NAME2_0_0_,
department0_.LOCATION AS LOCATION3_0_0_
FROM DEPARTMENT department0_
WHERE department0_.DEPARTMENT_ID=?
SELECT employees0_.DEPARTMENT_ID AS DEPARTMENT_ID3_1_0_,
employees0_.EMPLOYEE_ID AS EMPLOYEE_ID1_1_0_,
employees0_.EMPLOYEE_ID AS EMPLOYEE_ID1_1_1_,
employees0_.DEPARTMENT_ID AS DEPARTMENT_ID3_1_1_,
employees0_.EMPLOYEE_NAME AS EMPLOYEE_NAME2_1_1_
FROM EMPLOYEE employees0_
WHERE employees0_.DEPARTMENT_ID=?
Also zusammenfassend, im ersten Fall seit der FetchType
ist EAGER
Employees
werden eifrig zusammen mit Department
in einer einzigen JOIN
Abfrage abgerufen.
Und
Im zweiten Fall Employees
geholt mit Department
aber seit den FetchType
ist LAZY
eine separate Abfrage abgefeuert wird Employees
zu holen. Und wenn Sie entfernen @LazyCollection(LazyCollectionOption.FALSE)
Employees
überhaupt nicht abgerufen werden, bis Sie auf Employees
auf Department
Instanz zugreifen.
Ist diese Antwort auf Frage? ** Was ist der Unterschied zwischen Codes? ** – Sergii
in welchem Kontext brauchen Sie den Unterschied? @Sergii – eatSleepCode
Ist es Witz? Wenn Sie den ersten Code in Ihrem Programm und anderen Teil in Ihrem Programm anwenden. Welches Ergebnis sollte [email protected] _As für mich beide machen ähnliche result_ – Sergii