2016-07-07 58 views
1

代碼有什麼區別?@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; 
} 

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

至於他們兩個我做類似的結果,但第二種情況是比較乾淨。如果我誤以爲我錯了。

回答

2

註釋之間的主要區別是@OneToMany是純粹的JPA註釋。而@LazyCollection是Hibernate特有的。

因此,如果您希望您的代碼可以跨各種JPA提供程序移植,則應該使用JPA註釋。

更新

那兩個註釋之間的解釋,考慮Department -> Employee之間

案例1 OneToMany關係:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) 
@JoinColumn(name = "DEPARTMENT_ID") 
private List<Employee> employees = new ArrayList<>(); 

如果您在使用取從分貝Department對象:

entityManager.find(Department.class, 1L); 

下面的查詢被炒魷魚獲取數據

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=? 

所以這意味着它會在一個查詢一次獲取的所有數據。

案例2:

entityManager.find(Department.class, 1L); 

以下查詢被炒魷魚獲取數據:

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=? 

@LazyCollection(LazyCollectionOption.FALSE) 
@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY, orphanRemoval = true) 
@JoinColumn(name = "DEPARTMENT_ID") 
private List<Employee> employees = new ArrayList<>(); 

與之相似,如果你使用獲取從數據庫中一處對象

因此總而言之,在第一種情況下,因爲FetchTypeEAGEREmployees在單個JOIN查詢中與Department一起被熱切地獲取。

而且,

在第二種情況下,Employees是獲取與Department但是由於FetchTypeLAZY一個單獨的查詢將被解僱獲取Employees。如果你刪除@LazyCollection(LazyCollectionOption.FALSE)Employees將不會被提取,直到你訪問EmployeesDepartment實例。

+0

此問題的答案是? **代碼之間有什麼區別?** – Sergii

+0

在什麼情況下您需要區別? @Sergii – eatSleepCode

+0

這是開玩笑嗎?如果您在程序中應用第一個代碼,並在程序中應用其他部分。哪個結果應該是?@Sergii _As對我來說他們兩個都有類似的結果_ – Sergii