【学习笔记-SSH框架】Hibernate高级-笔记01-类级别检索策略

这篇学习笔记详细介绍了Hibernate中的类级别检索策略,包括立即加载和延迟加载。讲解了get()和load()方法的区别,以及它们在一级缓存和二级缓存中的行为。并提供了配置示例和测试代码,帮助理解如何实现类级别的立即加载和延迟加载。
摘要由CSDN通过智能技术生成

Hibernate高级-笔记01-类级别检索策略

目录

  1. 检索策略简介
  2. 类级别立即加载
  3. 类级别延迟加载

0. 检索策略简介

在Hibernate中,Session主要有两种检索方法:get()和load(),这两个方法都是用来从数据库中检索对象,并按照参数指定的对象标识符OID来加载一个持久化对象。

【示例】

Customer customer1 = session.get(Customer.class, 1);    //检索OID为1的Customer对象
Customer customer2 = session.load(Customer.class, 2);    //检索OID为2的Customer对象

检索策略主要有以下两种:

  • 类级别检索策略
    使用Session的load()或get()方法进行检索,对当前对象直接检索该对象本身。类级别加载又分为

    • 立即加载
    • 延迟加载

    在这里插入图片描述

  • 关联级别检索策略
    使用Session的load()或get()方法或使用HQL进行检索,对当前对象的关联对象进行检索。关联检索分为:

    • 立即加载
    • 延迟加载
    • 预先抓取
get()方法和load()方法的区别

get()方法和load()方法的区别在于对二级缓存的使用上。

  • load()方法会使用二级缓存,对使用了二级缓存的对象查询时最好使用load()方法,以充分利用二级缓存来提高检索效率。
  • get()方法在一级缓存没有找到的情况下会直接查询数据库,不会去二级缓存中查找。

1. 类级别立即加载

类级别加载默认级别就是类级别立即加载

【示例】
在XXX.hbm.xml文件中配置,加入属性 lazy="false"或者不加(默认情况就是立即加载)

<class name="com.chapter07.pojo.Customer" table="t_customer" lazy="false" schema="course_s2sh">

<class name="com.chapter07.pojo.Customer" table="t_customer" schema="course_s2sh">

【测试代码】

    /**
     * 测试类级别立即加载
     */
    @Test
    public void testClassLoad(){
        Session session = HibernateUtil.getSession();
        //检索id=2的Customer数据
        Customer customer = session.load(Customer.class, 2);
        String username = customer.getUsername();
        System.out.println("username = " + username);
    }
    //控制台输出
/*
    Hibernate: 
    select customer0_.id as id1_0_0_, 
            customer0_.username as username2_0_0_, 
            customer0_.password as password3_0_0_, 
            customer0_.address as address4_0_0_ 
    from t_customer customer0_ 
    where customer0_.id=?
    
    //out
    username = 张三
    */

当通过Session的load()方法加载对象时,Hibernate会立即执行查询t_customer表的select语句。

因此,立即加载是指宿主对象被加载时,其所关联的对象也会被立即加载。

2. 类级别延迟加载

【示例】
在XXX.hbm.xml文件中配置,加入属性 lazy="true"

<class name="com.chapter07.pojo.Customer" table="t_customer" lazy="true" schema="course_s2sh">

【代码示例】

    /**
     * 测试类级别延迟加载
     */
    @Test
    public void testClassLazyLoad(){
        Session session = HibernateUtil.getSession();
        //检索id=2的Customer数据
        Customer2 customer2 = session.load(Customer2.class, 2);
        //调用了getXXX()方法
        String username = customer2.getUsername();
        System.out.println("username = " + username);
    }


    //控制台输出
/*
    Hibernate: 
    select customer2x0_.id as id1_0_0_, 
            customer2x0_.username as username2_0_0_, 
            customer2x0_.password as password3_0_0_, 
            customer2x0_.address as address4_0_0_ 
    from t_customer customer2x0_ 
    where customer2x0_.id=?
    
    //out
    username = 张三
    */

当执行load()方法时,Hibernate不会立即执行select语句对数据库查询,而是返回Customer类的代理类的实例,当调用该实例的getXXX()/setXXX()等方法(getId()方法除外)时,Hibernate才真正从数据库加载Customer对象的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值