hibernate检索策略(抓取策略)

检索策略

  类级别检索

    默认检索策略:默认延迟加载, 可以使用lazy属性来进行改变.        

  session.get(clazz,object)默认立即加载

    @Test	//测试左外连接查询
	public void test13(){
		Session session = HibernateUtils.getSession();
		Transaction bt = session.beginTransaction();
		Customer customer = session.get(Customer.class,1);
		bt.commit();
		session.close();
	}

  

  session.load(clazz,object)默认延迟加载    可以使用Hibernate.initialize(customer)初始化数据;

      @Test	//load延迟加载
	public void test14(){
		Session session = HibernateUtils.getSession();
		Transaction bt = session.beginTransaction();
		Customer customer = session.load(Customer.class,1);
		bt.commit();
		session.close();
	}

关联级别检索

  一对一<one-to-one>

  一对多/多对一   <set>下有<one-to-many>      <many-to-one>

  多对多<many-to-many>

我们主要是在set下one-to-many或many-to-one设置lazy和fetch

查询一个客户下的订单

    set上

lazy
true 延迟检索
false 立即检索
extra 加强延迟加载
fetch
select 多条简单的sql语句
join 采用迫切左外连接
subselect 将生成子查询的sql

未进行设置则默认为懒加载

@Test
	public void test15(){
		Session session = HibernateUtils.getSession();
		Transaction bt = session.beginTransaction();
		String hql="from Customer c right outer join c.orders";
		Query query = session.createQuery(hql);
		List<Object[]> list = query.list();
		bt.commit();
		session.close();
	}

 sql打印:

Hibernate:
    select
        customer0_.c_id as c_id1_0_,
        customer0_.name as name2_0_
    from
        test.c_customer customer0_

  打印结果证明只进行查询了customer对象

  其中Order对象未进行加载  这样就是在调用时会发送sql语句进行查询  为了解决这一事件  我们让Customer立即加载

修改其配置文件:

  <set lazy="false" > //设置立即加载

  再次执行会sql打印

Hibernate:
    select
        customer0_.c_id as c_id1_0_,
        customer0_.name as name2_0_
    from
        test.c_customer customer0_
Hibernate:
    select
        orders0_.o_customer_id as o_custom4_1_0_,
        orders0_.o_id as o_id1_1_0_,
        orders0_.o_id as o_id1_1_1_,
        orders0_.o_money as o_money2_1_1_,
        orders0_.o_receiverInfo as o_receiv3_1_1_,
        orders0_.o_customer_id as o_custom4_1_1_
    from
        test.o_order orders0_
    where
        orders0_.o_customer_id=?
Hibernate:
    select
        orders0_.o_customer_id as o_custom4_1_0_,
        orders0_.o_id as o_id1_1_0_,
        orders0_.o_id as o_id1_1_1_,
        orders0_.o_money as o_money2_1_1_,
        orders0_.o_receiverInfo as o_receiv3_1_1_,
        orders0_.o_customer_id as o_custom4_1_1_
    from
        test.o_order orders0_
    where
        orders0_.o_customer_id=?

  这样在查询customer时会进行查询order

测试lazy=extra属性

<set lazy="true" > //设置延迟加载

  执行以下方法

      @Test
	public void test15(){
		Session session = HibernateUtils.getSession();
		Transaction bt = session.beginTransaction();
		String hql="from Customer";
		Query query = session.createQuery(hql);
		List<Customer> list = query.list();
		/*int size = list.size();
		System.out.println(size);*/
		for (Customer customer : list) {
			System.out.println(customer.getOrders().size());
		}
		//操作
		bt.commit();
		session.close();
	}

  sql打印:

Hibernate:
    select
        customer0_.c_id as c_id1_0_,
        customer0_.name as name2_0_
    from
        test.c_customer customer0_
Hibernate:
    select
        orders0_.o_customer_id as o_custom4_1_0_,
        orders0_.o_id as o_id1_1_0_,
        orders0_.o_id as o_id1_1_1_,
        orders0_.o_money as o_money2_1_1_,
        orders0_.o_receiverInfo as o_receiv3_1_1_,
        orders0_.o_customer_id as o_custom4_1_1_
    from
        test.o_order orders0_
    where
        orders0_.o_customer_id=?
1
Hibernate:
    select
        orders0_.o_customer_id as o_custom4_1_0_,
        orders0_.o_id as o_id1_1_0_,
        orders0_.o_id as o_id1_1_1_,
        orders0_.o_money as o_money2_1_1_,
        orders0_.o_receiverInfo as o_receiv3_1_1_,
        orders0_.o_customer_id as o_custom4_1_1_
    from
        test.o_order orders0_
    where
        orders0_.o_customer_id=?
100

  

<set lazy="extra" > //设置加强延迟加载

  sql打印为:

Hibernate:
    select
        customer0_.c_id as c_id1_0_,
        customer0_.name as name2_0_
    from
        test.c_customer customer0_
Hibernate:
    select
        count(o_id)
    from
        test.o_order
    where
        o_customer_id =?
1
Hibernate:
    select
        count(o_id)
    from
        test.o_order
    where
        o_customer_id =?
100

  

总结:
    对于懒加载和加强懒加载区别:都是是在调用时才会产生,但是区别在于发送sql语句的意义;
懒加载在发送sql语句时会发送查询全部的语句,返回为每一列,而加强懒加载发送的是count(*),我需要什么加强懒加载会给我什么直接查询,而懒加载不会.

  

测试fetch    只是sql的生成方式不同而已

 <set name="orders"  lazy="false" fetch="subselect" >  //subselect生成子查询
     @Test
	public void test15(){
		Session session = HibernateUtils.getSession();
		Transaction bt = session.beginTransaction();
		String hql="from Customer";
		Query query = session.createQuery(hql);
		List<Customer> list = query.list();
		bt.commit();
		session.close();
	}

  sql打印:

Hibernate:
    select
        customer0_.c_id as c_id1_0_,
        customer0_.name as name2_0_
    from
        test.c_customer customer0_
Hibernate:
    select
        orders0_.o_customer_id as o_custom4_1_1_,
        orders0_.o_id as o_id1_1_1_,
        orders0_.o_id as o_id1_1_0_,
        orders0_.o_money as o_money2_1_0_,
        orders0_.o_receiverInfo as o_receiv3_1_0_,
        orders0_.o_customer_id as o_custom4_1_0_
    from
        test.o_order orders0_
    where
        orders0_.o_customer_id in (    //子查询
            select
                customer0_.c_id
            from
                test.c_customer customer0_
        )

  

                                  在<many-to-one>或<one-to-one>如果去查询对方

fetch
select  
join  
lazy
false 立即加载
proxy 是否采用延迟,由另一方决定
no-proxy 不做研究
时间: 2024-10-16 23:23:26

hibernate检索策略(抓取策略)的相关文章

Hibernate(十四)抓取策略

抓取策略: 抓取策略是当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.Hibernate的抓取策略是Hibernate提升性能的一种手段,可以在获取关联对象的时候,对发送的语句进行优化,但是往往抓取策略需要和延迟加载一起使用来提升性能. 延迟加载的分类: 延迟加载(lazy load)是(也称为懒加载)Hibernate关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要

Hibernate学习---第十一节:Hibernate之数据抓取策略&amp;批量抓取

1.hibernate 也可以通过标准的 SQL 进行查询 (1).将SQL查询写在 java 代码中 /** * 查询所有 */ @Test public void testQuery(){ // 基于标准的 sql 语句查询 String sql = "select * from t_person"; // 通过 createSQLQuery 获取 SQLQuery,而 SQLQuer 是 Query的子类 SQLQuery query = session.createSQLQue

(转)hibernate 延迟加载和抓取策略

一.延迟加载 1.简单查询get,load 针对对象本身延迟或即时 当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象. 相对于load的延迟加载方式,get就直接的多,当我们使用session

【Hibernate学习】 —— 抓取策略(注解方式)

当应用程序需要在关联关系间进行导航的时候,hibernate如何获取关联对象的策略. 抓取策略的方式: FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载. FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载. 在项目中的体现,我这里有两个实体,一个放基础数据的实体,另一个是放操作记录的实体.这两个实体的关系是一对一关系,因此要把基础数据中的主键放在操作记录中作为外键,查询的时候查询操作记录表顺便把基础表相关信息

hibernate 延迟加载和抓取策略

一.延迟加载 1.简单查询get,load 针对对象本身延迟或即时 当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象. 相对于load的延迟加载方式,get就直接的多,当我们使用session

hibernate抓取策略

18.抓取策略 抓取策略的意思是,在hibernate中,由一个对象如何获取其关联对象的策略,抓取策略是一种优化方式 <set name="students"  lazy="false"  cascasd="save-update"  inverse="false" fetch="select"> 抓取策略: 1.研究的主要是set集合如何提取数据 2.在Classes.hbm.xml文件中 &

Hibernate 原汁原味的四种抓取策略(转)

原文出处:http://www.cnblogs.com/rongxh7/archive/2010/05/12/1733088.html     尊重原作者,访问原创地址 最近在研究 Hibernate 的性能优化的时候碰到了"抓取策略", 由于以前没有详细的研究过, 所以到处找资料, 但是无论从一些讲 Hibernate 书籍,还是他人 Blog 中都没有找到详细 介绍 Hibernate 文档中所说的原汁原味的抓取策略, 综合懒加载等等特性混在了一起, 所 以在这自己在借鉴了他人的基

Hibernate学习笔记(八) — 懒加载与抓取策略

懒加载(Load On Demand)是一种独特而又强大的数据获取方法,它能够在用户滚动页面的时候自动获取更多的数据,而新得到的数据不会影响原有数据的显示,同时最大程度上减少服务器端的资源耗用.总结一句话:什么时候需要数据,什么时候加载. 一.懒加载 1.1 类的懒加载 由javassist产生的代理类与Classes类是继承关系, session.load()方法产生的是代理对象,该代理类是持久化类的子类 /** * 类的懒加载 */ @Test public void testClass_l

【Hibernate 8】Hibernate的调优方法:抓取策略

在上一篇博客中,介绍了Hibernate的缓存机制.合理的配置缓存,可以极大程度上优化Hibernate的性能.这篇博客,介绍另外一个调优方式:抓取策略. 一.什么是抓取策略 抓取策略(fetching strategy):当应用程序需要在关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.抓取策略可以在O / R映射的元数据中声明,也可以在特定的HQL或条件查询(Criteria Query)中重载声明. 二.Hibernate的抓取策略 在Hibernate中,主要包括四种抓