2016-07-07 56 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