Java笔记之hibernate(九):属性延迟加载

0.说在前面

  基于Hibernate(八):多对多项目

1.概念

  hibernate中的延迟加载分为属性延迟加载关系延迟加载,其中的属性延迟加载是对于load方法来说的,使用load方法根据id查询对象数据时并不会直接发送sql进行数据查询,只有在使用到该对象的属性信息时才会发送sql进行查询.

2.新建LoadTest类

package com.hibernate.demo.test;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

import com.hibernate.demo.bean.Employee;

public class LoadTest {

    public static void main(String[] args) {
        //加载配置文件,创建会话工厂对象
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        //创建会话对象
        Session session = sessionFactory.openSession();
        
        //调用方法
        lazyLoad(session);
        
        //关闭会话对象
        session.close();
        //关闭会话工厂对象
        sessionFactory.close();
    }
    
    /**
     * 属性懒加载
     * @param session
     */
    private static void lazyLoad(Session session){
        System.out.println("log1");
        //使用load方法根据id查询对象信息
        Employee employee = (Employee) session.load(Employee.class, 2);
        System.out.println("log2");
        //获取对象的属性信息
        System.out.println(employee.getEmpName());
        System.out.println("log3");
    }

}

3.运行LoadTest类

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
log1
log2
Hibernate: select employee0_.emp_id as emp1_0_0_, employee0_.emp_name as emp2_0_0_, employee0_.dept_id as dept3_0_0_ from t_employee employee0_ where employee0_.emp_id=?
李四
log3

4.总结

  从3中的打印信息可以看出: 打印log1和log2之间并没有发送sql进行数据库查询,打印log2与log3之间访问了对象的名称信息,这时才进行了sql语句的发送进行数据库的查询操作,由此可见,load方法是具有属性延迟加载效果的.

posted @ 2020-04-24 10:35  安徒生敲代码  阅读(235)  评论(0编辑  收藏  举报