`
SIHAIloveYAN
  • 浏览: 122304 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

hibernate教程--抓取策略

 
阅读更多

Hibernate的抓取策略

1.1、 区分延迟和立即检索:

立即检索:

* 当执行某行代码的时候,马上发出SQL语句进行查询.

* get()

延迟检索:

* 当执行某行代码的时候,不会马上发出SQL语句进行查询.当真正使用这个对象的时候才会发送SQL语句.

* load();

1.2、类级别检索和关联级别检索:

类级别的检索:

* <class>标签上配置lazy

关联级别的检索:

* <set>/<many-to-one>上面的lazy.

1.2.1、从一的一方关联多的一方:

* <set>

* fetch:控制sql语句的类型

* join:发送迫切左外连接的SQL查询关联对象.fetch=”join”那么lazy被忽略了.

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

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

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

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

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

* extra:及其懒惰.

如果fetch是join的情况,lazy属性将会忽略.


1.2.2、在多的一方关联一的一方:

* <many-to-one>

* fetch:控制SQL语句发送格式

* join:发送一个迫切左外连接查询关联对象.fetch=”join”,lay属性会被忽略.

* select:发送多条SQL检索关联对象.

* lazy:关联对象检索的时候,是否采用延迟

* false:不延迟

* proxy:使用代理.检索订单额时候,是否马上检索客户 由Customer对象的映射文件中<class>上lazy属性来决定.

* no-proxy:不使用代理


测试:

package com.sihai.hibernate3.test;

import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.sihai.hibernate3.demo1.Customer;
import com.sihai.hibernate3.demo1.Order;
import com.sihai.utils.HibernateUtils;

/**
 * Hibernate的抓取策略
 * 
 * @author sihai
 * 
 */
public class HibernateTest4 {
	@SuppressWarnings("unchecked")
	@Test
	// 批量抓取:
	// 从订单批量抓取客户
	// 在Customer.hbm.xml中<class>标签上设置batch-size=""
	public void demo9(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		// 查询所有的订单:
		List<Order> list = session.createQuery("from Order").list();
		for (Order order : list) {
			System.out.println(order.getCustomer().getCname());
		}
		
		tx.commit();
		session.close();
	}
	
	@Test
	// 批量抓取:
	// 从客户批量抓取订单
	// <set>标签上设置batch-size=""
	public void demo8(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		// 查询所有客户
		List<Customer> list = session.createQuery("from Customer").list();
		for (Customer customer : list) {
			for (Order order : customer.getOrders()) {
				System.out.println(order.getAddr());
			}
		}
		
		tx.commit();
		session.close();
	}
	
	@Test
	// 在Order.hbml.xml中<many-to-one>标签上配置fetch和lazy
	public void demo7(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		/**
		 * fetch="select",lazy="false"
		 */
		// 查询一号订单
		//Order order = (Order) session.get(Order.class, 1);// 发送多条SQL查询关联对象
		// 查询一号订单所属客户的名称:
		//System.out.println("客户名称:"+order.getCustomer().getCname());// 不发送SQL
		
		/**
		 * fetch="select",lazy="proxy"
		 * proxy:查询关联对象的时候,是否采用延迟,由另一端的类级别延迟来决定.
		 * 	* Customer的<class>上配置的是lazy="true".检索的时候采用延迟
		 * 	* Customer的<class>上配置的是lazy="false".检索的时候不采用延迟
		 */
		// 查询一号订单
		Order order = (Order) session.get(Order.class, 1);// 发送多条SQL查询关联对象
		// 查询一号订单所属客户的名称:
		System.out.println("客户名称:"+order.getCustomer().getCname());// 不发送SQL
		
		tx.commit();
		session.close();
	}
	
	@Test
	// 在Order.hbml.xml中<many-to-one>标签上配置fetch和lazy
	public void demo6(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		
		/**
		 * fetch="join",lazy被忽略.
		 */
		// 查询一号订单
		Order order = (Order) session.get(Order.class, 1);// 发送一条迫切左外连接查询关联对象.
		// 查询一号订单所属客户的名称:
		System.out.println("客户名称:"+order.getCustomer().getCname());
		
		tx.commit();
		session.close();
	}
	
	@SuppressWarnings("unchecked")
	@Test
	// 在Customer.hbm.xml的<set>标签上配置fetch和lazy
	// fetch="subselect" 子查询
	public void demo5(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		/**
		 * 配置fetch="subselect" lazy="true"
		 */
//		List<Customer> list = session.createQuery("from Customer").list();// 发送查询所有客户的SQL
//		for (Customer customer : list) {
//			System.out.println("客户订单数量:"+customer.getOrders().size());// 发送一个子查询去查询关联对象.
//		}
		
		// 使用子查询 查询多个的情况.
		/*Customer customer = (Customer) session.get(Customer.class, 1);
		System.out.println("客户订单数量:"+customer.getOrders().size());*/
		
		/**
		 * 配置fetch="subselect" lazy="false"
		 */
//		List<Customer> list = session.createQuery("from Customer").list();// 发送查询所有客户的SQL,发送一个子查询查询订单
//		for (Customer customer : list) {
//			System.out.println("客户订单数量:"+customer.getOrders().size());// 不发送SQL
//		}
		
		/**
		 * 配置fetch="subselect" lazy="extra"
		 */
		List<Customer> list = session.createQuery("from Customer").list();// 发送查询所有客户的SQL
		for (Customer customer : list) {
			System.out.println("客户订单数量:"+customer.getOrders().size());// 只发送统计客户订单数量的sql
			for (Order order : customer.getOrders()) {
				System.out.println(order.getAddr());
			}
		}
		
		tx.commit();
		session.close();
	}
	
	@Test
	// 在Customer.hbm.xml的<set>标签上配置fetch和lazy
	// fetch="select"
	public void demo4() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();

		/**
		 * 配置fetch="select" lazy="true"
		 * * 发送多条SQL.默认值就是fetch="select" lazy="true"
		 */
		// 查询一号客户
		// Customer customer = (Customer) session.get(Customer.class, 1);//发送一条查询客户的SQL
		// 查看一号客户的订单的数量:
		// System.out.println("订单的数量:" + customer.getOrders().size());//又发送一条查询订单的SQL
		
		/**
		 * 配置fetch="select" lazy="false"
		 */
		// 查询一号客户
		//Customer customer = (Customer) session.get(Customer.class, 1);//发送多条SQL查询
		// 查看一号客户的订单的数量:
		//System.out.println("订单的数量:" + customer.getOrders().size());//不发送SQL
		
		/**
		 * 配置fetch="select" lazy="extra"
		 * * extra:及其懒惰的.
		 */
		// 查询一号客户
		Customer customer = (Customer) session.get(Customer.class, 1);// 发送一条查询客户的SQL
		// 查看一号客户的订单的数量:
		System.out.println("订单的数量:" + customer.getOrders().size());// 查询订单的数量:select count(oid) from orders o where o.cid = ? 
		
		for (Order order : customer.getOrders()) {
			System.out.println(order);
		}
		
		tx.commit();
		session.close();
	}
	
	@Test
	// 在Customer.hbm.xml的<set>标签上配置fetch和lazy
	// fetch="join",lazy的取值就会被忽略.
	public void demo3() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();

		// 查询一号客户
		Customer customer = (Customer) session.get(Customer.class, 1);// 发送了一条迫切左外连接的SQL
		
		// 查看一号客户的订单的数量:
		System.out.println("订单的数量:" + customer.getOrders().size());// 不发送SQL.
		
		tx.commit();
		session.close();
	}

	@Test
	// 默认的情况下 没有配置任何信息
	// 发送多条SQL查询其关联对象.
	public void demo2() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();

		// 查询一号客户
		Customer customer = (Customer) session.get(Customer.class, 1);// 发送一条查询客户的SQL.

		// 查看一号客户的订单的数量:
		System.out.println("订单的数量:" + customer.getOrders().size());// 使用订单的时候,又会发送一条SQL查询

		tx.commit();
		session.close();
	}

	@Test
	// 区分立即和延迟检索
	public void demo1() {
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();

		// 立即检索
		// Customer customer = (Customer) session.get(Customer.class, 1);

		// System.out.println(customer.getCname());

		// 延迟检索:
		Customer customer = (Customer) session.load(Customer.class, 1);

		Hibernate.initialize(customer);

		System.out.println(customer.getCname());

		tx.commit();
		session.close();
	}
}


分享到:
评论

相关推荐

    hibernate 3.5.0-final core reference 中文pdf

    - **实现继承**:解释了如何在Hibernate中实现不同类型的继承策略。 - **实现equals()和hashCode()方法**:强调了重写这两个方法对于实体对象的重要性和必要性。 - **动态模型**:介绍了如何使用Hibernate的API来...

    day36 06-Hibernate抓取策略:set集合上的抓取策略

    在提供的压缩包文件"hibernate_day03"中,可能包含了相关的代码示例或教程,可以帮助你更直观地学习和体验Hibernate的抓取策略。通过深入学习和实践,你将能够更好地应对各种复杂的数据库操作场景。

    hibernate3.5.6中文文档pdf格式

    - **外连接抓取(Outer Join Fetching)**:介绍了Hibernate如何通过外连接查询提高性能。 - **二进制流(Binary Streams)**:解释了如何处理大二进制对象(BLOB)。 - **二级缓存与查询缓存**:讲解了Hibernate...

    hibernate 教程

    外连接抓取(Outer Join Fetching ) 3.5.3. 二进制流 3.5.4. 自定义CacheProvider 3.5.5. 事务策略配置 3.5.6. 绑定SessionFactory到JNDI 3.5.7. 查询语言替换 3.6. Logging 3.7. 实现...

    hibernate3.5.4中文帮助文档.pdf

    - 外连接抓取:控制Hibernate如何使用外连接查询来优化数据检索。 - 二进制流:描述了如何处理数据库中的二进制大对象(BLOB)。 - 二级缓存与查询缓存:介绍了Hibernate的缓存机制,包括如何启用和配置缓存。 - ...

    Hibernate 3.6.0.Final Reference PDF 手册

    - **外连接抓取(Outer Join Fetching)**:启用或禁用外连接抓取以优化查询性能。 - **二进制流(Binary Streams)**:配置处理二进制数据的方式。 - **二级缓存与查询缓存**:启用缓存机制以提高应用程序性能。...

    HIBERNATE - 符合Java习惯的关系数据库持久化.docx

    《Hibernate - 符合Java习惯的关系数据库持久化》是一份关于Hibernate框架的详细教程,旨在帮助Java开发者理解和应用Hibernate进行数据库操作。Hibernate是Java领域中的一款流行的对象关系映射(ORM)工具,它允许...

    hibernate_3.3.2GA中文参考手册

    #### 一、前言及教程概览 **1.1 第一部分 - 第一个Hibernate应用程序** - **Setup**: 设置环境,包括添加必要的库文件、配置文件等。 - **第一个Class**: 创建一个简单的Java类,用于表示数据库中的实体。 - **...

    java私塾独家首发最新Hibernate4教程

    - **抓取策略**:控制对象加载时机。 - **集合性能**:优化集合的加载和存储。 - **二级缓存**:使用第三方缓存实现如EHCache,提高读写性能。 - **查询缓存**:缓存查询结果,减少数据库访问。 - **缓存管理**:...

    Hibernate教程

    20.1.2. 调整抓取策略(Tuning fetch strategies) 20.1.3. 单端关联代理(Single-ended association proxies) 20.1.4. 实例化集合和代理(Initializing collections and proxies) 20.1.5. 使用批量抓取(Using...

    hibernate4.1中文api

    教程 ##### 1.1 第一部分 - 第一个Hibernate应用程序 - **设置**: 安装必要的开发环境,包括Java SDK、IDE(如Eclipse或IntelliJ IDEA)、Hibernate库等。 - **第一节**: 简介Hibernate的基本概念,如Session、...

    BONC_Hibernate

    - **可选的配置属性**:如SQL方言、外连接抓取等。 - **日志**:配置Hibernate的日志输出。 - **实现NamingStrategy**:自定义命名策略。 4. **持久化类** - **简单的POJO例子**:使用普通Java对象作为持久化类...

    hibernate中文官方文档3.6

    文档的“教程”部分是新手了解和学习Hibernate的重要途径,它分为三个主要部分: 1. **第一部分 - 第一个Hibernate应用程序**:介绍了如何创建并运行一个简单的Hibernate程序。 - **设置**:介绍环境搭建步骤,包括...

    hibernate.api

    - **实现 NamingStrategy**:自定义命名策略以影响 Hibernate 如何解析类名和字段名。 - **实现 Persister 类提供者**:扩展 Hibernate 的默认行为,例如自定义映射策略。 - **XML 配置文件**:详解如何使用 XML ...

    HIBERNATE doc_document_官方文档_4.3.6_final_2014_8

    - **Hibernate教程**: 包括第一部分——第一个Hibernate应用程序,第二部分——映射关联,第三部分——EventManager Web应用程序。每部分都提供了详细的步骤和代码示例,让开发者能够通过实践来学习Hibernate的使用...

    hibernate中文文档

    - **实现NamingStrategy**:自定义命名策略来处理Hibernate生成的SQL语句中的表名和列名。 - **XML配置文件**:详细说明如何使用XML文件来配置Hibernate的各种设置。 - **J2EE应用程序服务器的集成**:探讨如何将...

    hibernate3.6.6 中文帮助文档

    - **外连接抓取**:控制外连接抓取的行为。 - **二进制流**:处理二进制数据类型。 - **二级缓存与查询缓存**:提高性能的有效手段之一。 - **查询语言中的替换**:用于在查询中动态替换参数。 - **Hibernate ...

    hibernate3.6.3中文api

    - **对象关系映射基础**:这是 Hibernate 最为核心的部分之一,涉及实体映射、标识符的处理、乐观锁定、属性映射、嵌入式对象以及继承策略等方面。 #### 三、入门教程详解 - **第一部分 - 第一个 Hibernate 应用...

    Hibernate3.6中文文档

    ### Hibernate 3.6 关键知识点解析 #### 一、简介 **Hibernate 3.6** 是一款流行的 Java 持久层框架,它通过...此外,Hibernate 还提供了许多高级特性,如事件监听、缓存策略等,这些将在后续的学习过程中逐渐了解。

    Hibernate中文手册

    - 回顾整个入门教程,强调重要的概念和步骤。 #### 二、体系结构与配置 **2.体系结构(Architecture)** - **概况(Overview)**: - 描述Hibernate的核心组件和工作原理。 - **实例状态**: - 解释持久化实体...

Global site tag (gtag.js) - Google Analytics