注释之间的主要区别是@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<>();
与之相似,如果你使用获取从数据库中一处对象
因此总而言之,在第一种情况下,因为FetchType
是EAGER
Employees
在单个JOIN
查询中与Department
一起被热切地获取。
而且,
在第二种情况下,Employees
是获取与Department
但是由于FetchType
是LAZY
一个单独的查询将被解雇获取Employees
。如果你删除@LazyCollection(LazyCollectionOption.FALSE)
Employees
将不会被提取,直到你访问Employees
的Department
实例。
此问题的答案是? **代码之间有什么区别?** – Sergii
在什么情况下您需要区别? @Sergii – eatSleepCode
这是开玩笑吗?如果您在程序中应用第一个代码,并在程序中应用其他部分。哪个结果应该是?@Sergii _As对我来说他们两个都有类似的结果_ – Sergii