Hibernate延迟检索和立即检索

本文详细解析了Hibernate框架中的两种加载策略:立即加载(get())和延迟加载(load())。介绍了它们在代码执行过程中的不同行为,以及如何在类级别和关联级别配置延迟加载,包括fetch策略和lazy属性的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

立即检索:
get()
当执行某行代码的时候,马上发出sql语句进行查询

延迟检索:
load()
当执行某行代码的时候,不会马上发出sql语句进行查询,当真正使用这个对象的时候才会发送sql语句



实例代码:

@Test

   public void test1(){

       Session session = HibernateUtil.openSession();
       Transaction tx = session.beginTransaction();
              
 //立即检索
//           Studentstudent = (Student) session.get(Student.class, 1);
//           System.out.println(student);

  /*

 * 延迟加载
* 持久化类如果设置了final 延迟加载立即失效
* 在Student.hbm.xml 文件的class里面设置lazy="false"不支持延迟加载

  */
	 Student student = (Student) session.load(Student.class, 1);

            System.out.println(student);

              tx.commit();

              session.close();

       }

类级别检索和关联级别检索

   类级别检索:

          <class>标签上配置lazy

   关联级别检索:

          <set>/<many-to-one>上面的配置lazy

从一的一方关联多的一方

   <set>

          fetch:控制sql语句的类型

                 join:发送迫切左外连接的sql查询关联对象 如果在配置文件中配置了fetch=”join” 那么后面配置了lazy将被忽略

                 select:默认值,发送多条sql查询关联对象

                 subselect:发送子查询关联对象(需要用Query接口测试)

          lazy:控制关联对象的检索是否采用延迟

                 true:默认值,查询关联对象的时候使用延迟检索

                 false:查询关联对象的时候不适用延迟检索

                 extra:及其懒惰


/*

        *   fetch="subselect"lazy="true"  如果lazy参数为false那么就不延迟  如果参数为extra那么就发送count()

        *          
        *          一个:
        *         select  from Orders where cno = (1)
        *          多个: select from Orders where cno in (1,2,3)
        * 
        */



@Test

    public void test7(){
         Session session = HibernateUtil.openSession();
         Transaction tx = session.beginTransaction();
         @SuppressWarnings("unchecked")
         List<Student> list = session.createQuery("from Student").list();

              for(Student student : list) {
                    System.out.println(student.getOrders().size());
              }
            
              tx.commit();

              session.close();

       }



// 在配置文件中配置了fetch="join"发送一个迫切左外连接sql语句

       @Test
    public void test2(){
        Session session = HibernateUtil.openSession();
        Transaction tx = session.beginTransaction();
       //发送查询客户的sql语句
       Student student = (Student) session.get(Student.class, 1);

  //当使用客户订单的时候,才会发送查询订单的sql
        System.out.println(student.getOrders().size());
              

              tx.commit();

              session.close();

       }



 * 延迟加载

   * 持久化类如果设置了final 延迟加载立即失效

  * 在Student.hbm.xml 文件的class里面设置lazy="false"不支持延迟加载

    */

          Student student = (Student) session.load(Student.class, 1);
          System.out.println(student);
           
            tx.commit();
            session.close();

       }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值