Hiberante_lazy延迟加载总结

如果想对实体对象使用延迟加载,必须要在实体的映射配置文件中进行相应的配置,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<hibernate-mapping>   

<class name=”net.ftng.entity.user” table=”user” lazy=”true”>

……

</class>

</hibernate-mapping>
```
通过将class的lazy属性设置为true,来开启实体的延迟加载特性。如果我们运行下面的代码:
```
User user=(User)session.load(User.class,”1”);(1)

System.out.println(user.getName());(2)

当运行到(1)处时,Hibernate并没有发起对数据的查询,
当代码运行到(2)处时,此时调用user.getName()方法,这时通过CGLIB赋予的回调机制,
target属性是否为null,如果不为空,则调用目标对象的getName方法,如果为空,则会发起数据库查询

通过一个中间代理对象,Hibernate实现了实体的延迟加载,
只有当用户真正发起获得实体对象属性的动作时,
才真正会发起数据库查询操作。
所以实体的延迟加载是用通过中间代理类完成的,
所以只有session.load()方法才会利用实体延迟加载,
因为只有session.load()方法才会返回实体类的代理类对象。