Hibernate:立即加载和延迟加载

it2022-05-05  67

默认为延迟加载 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。 通过load加载的延迟状态的Dept代理实例,除了OID,其他属性均为null,通过调用他的getDeptName()属性等方法可以促进Hibernate执行查询,获得数据从而完成该代理实例的初始化。org.hibernate.Hibernate.类的initialize()静态方法用于显示初始化代理类实例,isInitialzed()方法用于判断该代理实例是否已经被初始化如果加载的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的程序提供更加透明的持久化服务,不过需要在编译期间进行字节码增强操作,因此很少用到。      

转载于:https://www.cnblogs.com/wzdnwyyu/p/11169939.html


最新回复(0)