在缺省情况下,Hibernate对所有的实体之间的关联使用懒加载(关联对象)。
通过asm和cglib两个包实现,Domain必须是非final的。
1. session.load懒加载;
2. one-to-one(元素)懒加载:
对于一对一关联主对象的查询,Hibernate默认不使用懒加载而进行连接查询;
对于一对一关联从对象的查询,Hibernate默认使用懒加载
必须同时满足下面三个条件时才能实现懒加载:
1) 主表不能有constrained=true,所以主表没有懒加载
2) lazy != false(默认为proxy)(<one-to-one lazy=“proxy” name=“” constrained=“”>)
3) constrained=true
4) fetch=select
3. one-to-many(元素)懒加载:
1) lazy != false
2) fetch = select
4. many-to-one(元素):
1) lazy != false
2) fetch = select
5. many-to-many(元素):
1) lazy != false
2) fetch = select
6. 能够懒加载的对象都是被改写过的代理对象(被代理对象的子类):当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性(getId和getClass除外)Hibernate会初始化这些代理,或用Hibernate.initialize(Object proxy)来初始化代理对象;当相关联的session关闭后,再访问懒加载的对象将出现异常。
7. 对one-to-many和many-to-many关联使用懒加载的意义是很重大的,直接关系到数据库查询的效率。
8. Hibernate对一对多关联中集合(Set)对象是否为空和集合对象是否包含元素不作区分。
也就是说,Hibernate假设Department包含Employee,所以默认生成代理以实现懒加载,而不是通过查询Employee来决定给集合对象赋值。