2016-07-07 8 views
1

Was ist der Unterschied zwischen Codes?@OneToMany (EAGER) vs @LazyCollection (FALSE) & OneToMany (LAZY)

@LazyCollection(LazyCollectionOption.FALSE) 
@OneToMany(mappedBy = "siteesTypeSite", cascade = CascadeType.ALL,fetch = FetchType.LAZY) 
public Set<Sites> getSitees() { 
    return sitees; 
} 

und

@OneToMany(mappedBy = "siteesTypeSite", cascade = CascadeType.ALL,fetch = FetchType.EAGER) 
public Set<Sites> getSitees() { 
    return sitees; 
} 

Was mich beide von ihnen macht ähnliches Ergebnis, aber zweite Fall ist sauberer. Wenn ich falsch verstanden habe, korrigiere mich bitte.

Antwort

2

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 EAGEREmployees 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.

+0

Ist diese Antwort auf Frage? ** Was ist der Unterschied zwischen Codes? ** – Sergii

+0

in welchem ​​Kontext brauchen Sie den Unterschied? @Sergii – eatSleepCode

+0

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