7.Hibernate 延迟加载&当即加载

延迟加载的好处
1.下降了内存的开销,在用到某些数据的时候才会到数据中进行查询。
2.提升了程序运行性能。
注:若是session被关闭了,而你又想用到某些数据,这个时候使用延迟加载会出错;须要当即加载或者使用OpenSessionInView。

数据库

当即加载的坏处
1.select语句的数目太多,须要频繁的访问数据库,会影响查询性能。
2.如在应用程序只须要访问DEPT对象,而不须要访问EMP对象的场合,加载EMP对象彻底是多余的操做,这些EMP对象白白浪费了内存空间。
注:若是session被关闭了,而你想访问EMP对象,这个时候是不会出错的,由于对象都被加载到内存了。

lazy属性
session

类级别 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>元素用来设设置。
spa

当即加载
  当即加载和上面同样,会执行两条select语句来加载数据。
延迟加载
  当使用get方法时,当即执行查询Emp对象的select语句,Emp对象的dept属性引用Dept代理类的实例,这个代理类实例的OID有EMP表的DEPTNO外键值决定。当使用dept属性的时候才会执行select语句来查询Dept信息。
代理