假设我有一个协会,
class Department{
......
@OneToMany(fetch = FetchType.LAZY)
private List<Employee> employees;
}
现在我去拿的时候 Department
,它能带来什么吗 employees list
或者它会是完全空的。
雇员对象的标识符是否会加载到列表中,比如说我有雇员对象属性below:-
Employee{
id
name
doj
....
}
Lazy object like {
id -> 111
name -> null
doj -> null
}
现在,当我初始化employee对象或使用getter访问它的属性时,将使用id作为标识符从数据库加载对象。。。??
4条答案
按热度按时间aij0ehis1#
在您的情况下,直到您显式访问
Department.employees
(通过吸气剂或任何其他方法)它不会加载Employee
实体。会有代理的。它将在第一次调用时初始化一次以访问此employees
收藏。fcipmucu2#
而不是真正的集合类(例如。
ArrayList
)一个不同的List
实现被注入到您的领域(PersistentList
). 根据对该集合的调用和延迟策略,它将执行不同的操作:万一
lazy="lazy"
对任何collections方法的调用都将使集合完全加载如果
lazy="extra"
,则对某些函数的调用将触发sql而不加载集合。例如list.size()
会触发select count...
. 当获取第一个元素时,将只选择该元素。这可能适用于大型收藏。请注意,此行为还可能取决于集合类型—无序集合将加载所有元素。f2uvfpb93#
hibernate中的延迟加载工作原理
hibernate对实体和关联应用延迟加载行为的最简单方法是提供它们的代理实现。hibernate通过替换从实体类派生的代理来拦截对实体的调用。当请求的信息丢失时,将从数据库中加载该信息,然后将控制权移交给父实体的实现。
请注意,当关联表示为集合类时,将创建一个 Package 器(本质上是集合的代理,而不是它所包含的实体的代理)并替换原始集合。当您访问这个集合代理时,您在返回的代理集合中得到的不是代理实体;相反,它们是真实的实体。您不需要在理解这个概念上施加太大的压力,因为在运行时它几乎无关紧要。
有关更多信息,请参阅:http://howtodoinjava.com/hibernate/lazy-loading-in-hibernate/
同时启用
hibernate.sql.show=true
这样您就可以看到在尝试获取集合时触发了哪些查询。6yt4nkrj4#
延迟获取类型,hibernate不会加载特定对象示例的关系。
FetchType.LAZY
=不加载关系,除非通过getter显式地“请求”FetchType.EAGER
=加载所有关系在您的例子中,除非您显式地为它启动查询,否则它不会从数据库中加载雇员列表,因为您已经设置了fetch type(fetch=fetchtype.lazy)。如果fetch type是(fetch=fetchtype.eager),那么它将显式地为employee list触发select查询。在该对象中,您将获得所有雇员属性,例如name,doj。
将使用id作为标识符从数据库加载对象。。。??
在雇员中。。。。您需要通过引用department对象来Map它。如:
这样它就会变成双向的。现在hibernate将通过引用(本机sql中的id)触发查询。
如果您想在两个Map中延迟加载set fetch mode fetchtype.lazy。。。。