- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
代码之间有什么区别?
@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;
}
对我来说,他们两个都得到了相似的结果,但第二种情况更清晰。如果我记错了请指正。
最佳答案
注释之间的主要区别在于 @OneToMany
是纯 JPA 注释。而 @LazyCollection
是特定于 Hibernate 的。
因此,如果您希望您的代码可以跨各种 JPA 提供程序移植,您应该使用 JPA 注释。
为了解释这两个注释之间的关系,请考虑 Department -> Employee
之间的 OneToMany
关系
案例 1:
@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:
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY, 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_
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=?
总结一下,在第一种情况下,因为 FetchType
是 EAGER
Employees
与 Department
一起被急切地获取在单个 JOIN
查询中。
还有,
在第二种情况下,Employees
是通过 Department
获取的,但是由于 FetchType
是 LAZY
,因此单独的查询将被解雇以获取 Employees
。如果你删除 @LazyCollection(LazyCollectionOption.FALSE)
Employees
根本不会被获取,直到你访问 Department
上的 Employees
> 实例。
关于java - @OneToMany(EAGER) 与@LazyCollection(FALSE)&OneToMany(LAZY),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38242199/
我需要一个函数来返回一个惰性生成器,该生成器由各种组合的生成器函数(例如过滤器和映射)组成。例如,如果我想申请 lazy.filter().map()代码如下: // Simplified typea
我有 2 个实体作为 Parent 和 Child 作为 OneToMany 关系 @Entity public class Parent { @Id @GeneratedValue(strategy
ProdutoValor 它是一个包含与 Produto 的多对一关系的表。这是我获取 ProdutoValor 中所有数据的方法: @Override public List get
我有一个实体,其中一个字段用 @LazyCollection(LazyCollectionOption.FALSE) 注释。我不能(不允许)改变这一点。是否可以通过 @FetchProfile 覆盖它
代码之间有什么区别? @LazyCollection(LazyCollectionOption.FALSE) @OneToMany(mappedBy = "siteesTypeSite", casca
我对“延迟加载”有一个疑问。使用 @LazyCollection(LazyCollectionOption.FALSE) 和 @OneToMany(fetch = FetchType.EAGER) 有
我是一名优秀的程序员,十分优秀!