Hibernate:立即加载和延迟加载

默认为延迟加载
when:
如果程序加载一个持久化对象的目的是访问它的属性,则可以采用立即加载
如果程序加载一个持久化对象的目的仅仅是获得它的引用,则可以采用延迟加载。
 Dept dept = (Dept)session.load(Dept.class,10L);
        Employee employee1 = new Employee();
        employee1.setEmpno(558L);
        employee1.setEname("sa");
        employee1.setDeptByDeptno(dept);--加载这个部门,不是要用这个部门,只是为了获得这个部门的引用。
设置class节点的延迟加载:
在class节点设置lazy属性为true的话,load时只会加载这个实例的id。
  1. 通过load加载的延迟状态的Dept代理实例,除了OID,其他属性均为null,通过调用他的getDeptName()属性等方法可以促进Hibernate执行查询,获得数据从而完成该代理实例的初始化。
  2. org.hibernate.Hibernate.类的initialize()静态方法用于显示初始化代理类实例,isInitialzed()方法用于判断该代理实例是否已经被初始化
  3. 如果加载的Dept代理实例的OID在数据库中不存在,session的load方法不会立即抛出异常,因为此时并未真正执行查询,只有当Hibernate试图完成对Dept代理实例的初始化时,才会真正执行查询语句
 
 
设置set节点的lazy属性:
立即加载。
延迟加载:
那Dept的emps什么时候会被初始化呢?
会话关闭前,引用程序第一次访问它时,如调用它的iterator()、size()、isEmpty()、contains()方法
会话关闭前,通过Hibernate类的initialize()静态方法初始化
Set<Emp> emps = dept..getEmps()
Hibernate,initialize(emps);//导致emps集合代理类实例被初始化
增强延时加载:
程序第一次访问它的size()、isEmpty()、contains()方法,Hibernate不会初始化emps集合代理实例。
 
 
 
设置many-to-one的lazy属性
proxy延迟加载:
no-proxy无代理延迟加载:
避免使用由Hibernate提供的代理类实例,使Hibernate的程序提供更加透明的持久化服务,不过需要在编译期间进行字节码增强操作,因此很少用到。
 
 
 
posted @ 2019-07-11 14:48  TangXinPing  阅读(332)  评论(0编辑  收藏  举报