** 延迟加载的好处**
1.降低了内存的开销,在用到某些数据的时候才会到数据中进行查询。
2.提高了程序运行性能。
注:如果session被关闭了,而你又想用到某些数据,这个时候使用延迟加载会出错;需要立即加载或者使用OpenSessionInView。
** 立即加载的坏处**
1.select语句的数目太多,需要频繁的访问数据库,会影响查询性能。2.如在应用程序只需要访问DEPT对象,而不需要访问EMP对象的场合,加载EMP对象完全是多余的操作,这些EMP对象白白浪费了内存空间。注:如果session被关闭了,而你想访问EMP对象,这个时候是不会出错的,因为对象都被加载到内存了。
** lazy属性**
类级别
1.true 延迟加载(默认值)
2.false 立即加载
一对多级联级别
1.true 延迟加载(默认值)
2.extra 增强延迟加载
3.false 立即加载
多对一关联级别
1.proxy 延迟加载(默认值)
2.no-proxy 无代理延迟加载
3.false 立即加载
类级别,使用<class>元素来配置加载策略
立即加载
将lazy属性设置为false则为立即加载。
当时用load方法查询数据的时候,会立即执行一条select语句,来查询出数据。
延迟加载
如果程序加载一个持久化对象的目的是为了访问它的属性,则可以采用立即加载。如果程序加载一个持久化类对象的目的仅仅是为了获取它的引用,而不访问它的数据,则可以使用延迟加载。例如:
Dept dept = (Dept)session.load(Dept.class, 10);
Emp emp = new Emp(1,"TOM");
emp.setDept(dept);
session.save(emp);
说明向数据保存了一个Emp对象,他与一个Dept对象进行了关联。
如果Dept使用了延迟加载,则session不会执行select语句来查询对应的数据,这个时候Dept对象中的ID属性为你设置的10,其他属性则为null,这是load方法的特点。
一对多和多对多关联的查询策略,使用<set>元素来配置一对多或多对多加载策略<set>元素的lazy属性,主要决定Dept对象的emps集合(emps属性是Set集合)被初始化的时机,到底是加载Dept对象时就被初始化(从数据查询数据),还是在程序访问emps集合的时候在初始化。
立即加载
通过Session的get方法加载ID为10的Dept对象。
hibernate会执行两条select语句,第一条是select * from Dept where deptno = ?第二条select * from Emp where DEPTNO = ?
也就是说使用立即查询,不管你有没有用到emps集合中的数据,Hibernate都将给你查询出来,放到内存中。
延迟加载
延时加载只会先执行一条select语句,select * from Dept where deptno = ?。
当你使用到了emps集合的时候,才会执行第二条select * from Emp where DEPTNO = ?语句来查询出对应的数据。
多对一关联的查询策略,在<many-to-no>元素用来设设置。
立即加载
立即加载和上面一样,会执行两条select语句来加载数据。
延迟加载
当使用get方法时,立即执行查询Emp对象的select语句,Emp对象的dept属性引用Dept代理类的实例,这个代理类实例的OID有EMP表的DEPTNO外键值决定。
当使用dept属性的时候才会执行select语句来查询Dept信息。