`

Hibernate抓取策略二

阅读更多

在Classes与Student一对多映射中,我们将Set里面的fetch属性设置为subselect来实现子查询。

如下示例

首先看一下set中fetch="select"即默认情况下:

生成数据类:

package com.bjsxt.hibernate;

import org.hibernate.Session;

public class InitData {

	public static void main(String[] args) {
		Session session = HibernateUtils.getSession();
		try {
			session.beginTransaction();
			for(int i=0; i<10; i++){
				Classes classes = new Classes();
				classes.setName("班级"+i);
				session.save(classes);
				for(int j=0; j<10; j++){
					Student student = new Student();
					student.setName("班级"+i+"的学生"+j);
					//在内存中建立由student指向classes的引用
					student.setClasses(classes);
					session.save(student);
				}
			}
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally{
			HibernateUtils.closeSession(session);
		}
	}

}

 

测试类:

package com.bjsxt.hibernate;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.hibernate.Session;

import junit.framework.TestCase;

public class FetchTest extends TestCase {

	public void testFetch1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			Classes classes = (Classes)session.load(Classes.class, 1);
			System.out.println("班级:" + classes.getName());
			Set students = classes.getStudents();
			for (Iterator iter = students.iterator(); iter.hasNext();) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}
	
	public void testFetch2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			List Classes = session.createQuery("select c from Classes c where c.id in(1, 2, 3)").list();
			for (Iterator iter = Classes.iterator(); iter.hasNext();) {
				Classes cls = (Classes)iter.next();
				System.out.println("班级:" + cls.getName());
				for (Iterator iter1 = cls.getStudents().iterator(); iter1.hasNext();) {
					Student student = (Student)iter1.next();
					System.out.println(student.getName());
				}
			}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}
	
}

 

分别列出方法一与方法二的测试结果:

Hibernate: select classes0_.id as id0_0_, classes0_.name as name0_0_ from t_classes classes0_ where classes0_.id=?
班级:班级0
Hibernate: select students0_.classid as classid0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.classid as classid1_0_ from t_student students0_ where students0_.classid=?
班级0的学生8
班级0的学生1
班级0的学生7
班级0的学生5
班级0的学生3
班级0的学生4
班级0的学生0
班级0的学生6
班级0的学生9
班级0的学生2

 

Hibernate: select classes0_.id as id0_, classes0_.name as name0_ from t_classes classes0_ where classes0_.id in (1 , 2 , 3)
班级:班级0
Hibernate: select students0_.classid as classid0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.classid as classid1_0_ from t_student students0_ where students0_.classid=?
班级0的学生7
班级0的学生2
班级0的学生3
班级0的学生1
班级0的学生0
班级0的学生9
班级0的学生4
班级0的学生8
班级0的学生6
班级0的学生5
班级:班级1
Hibernate: select students0_.classid as classid0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.classid as classid1_0_ from t_student students0_ where students0_.classid=?
班级1的学生9
班级1的学生0
班级1的学生6
班级1的学生8
班级1的学生7
班级1的学生2
班级1的学生5
班级1的学生3
班级1的学生1
班级1的学生4
班级:班级2
Hibernate: select students0_.classid as classid0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.classid as classid1_0_ from t_student students0_ where students0_.classid=?
班级2的学生6
班级2的学生9
班级2的学生3
班级2的学生1
班级2的学生2
班级2的学生7
班级2的学生8
班级2的学生4
班级2的学生0
班级2的学生5

 

下面更改fetch="subselect"

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.bjsxt.hibernate.Classes" table="t_classes">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<!-- 
			<set name="students" cascade="all" order-by="id">
		 -->
		 <set name="students" inverse="true" fetch="subselect">
			<key column="classid"/>
			<one-to-many class="com.bjsxt.hibernate.Student"/>
		</set>
	</class>
</hibernate-mapping>

 

同样,将两个方法的测试结果列出如下:

Hibernate: select classes0_.id as id0_0_, classes0_.name as name0_0_ from t_classes classes0_ where classes0_.id=?
班级:班级0
Hibernate: select students0_.classid as classid0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.classid as classid1_0_ from t_student students0_ where students0_.classid=?
班级0的学生3
班级0的学生1
班级0的学生9
班级0的学生7
班级0的学生5
班级0的学生0
班级0的学生6
班级0的学生2
班级0的学生8
班级0的学生4

 

Hibernate: select classes0_.id as id0_, classes0_.name as name0_ from t_classes classes0_ where classes0_.id in (1 , 2 , 3)
班级:班级0
Hibernate: select students0_.classid as classid0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.classid as classid1_0_ from t_student students0_ where students0_.classid in (select classes0_.id from t_classes classes0_ where classes0_.id in (1 , 2 , 3))
班级0的学生5
班级0的学生1
班级0的学生0
班级0的学生8
班级0的学生7
班级0的学生2
班级0的学生9
班级0的学生6
班级0的学生4
班级0的学生3
班级:班级1
班级1的学生5
班级1的学生1
班级1的学生0
班级1的学生7
班级1的学生4
班级1的学生9
班级1的学生8
班级1的学生3
班级1的学生6
班级1的学生2
班级:班级2
班级2的学生0
班级2的学生5
班级2的学生1
班级2的学生8
班级2的学生6
班级2的学生9
班级2的学生4
班级2的学生7
班级2的学生3
班级2的学生2

 

比较两次测试的结果我们发现,方法二的输出结果不同,当fetch="subselect"的时候,方法二进行了子查询

如:

Hibernate: select students0_.classid as classid0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.classid as classid1_0_ from t_student students0_ where students0_.classid in (select classes0_.id from t_classes classes0_ where classes0_.id in (1 , 2 , 3))

 

分享到:
评论

相关推荐

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

    今天我们将深入探讨"day36 06-Hibernate抓取策略",特别是针对set集合的抓取策略。在阅读这篇博客文章(链接:https://364232252.iteye.com/blog/2368811)后,我们将了解到如何优化数据加载,以避免N+1查询问题,...

    hibernate抓取策略和懒加载案例

    在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...

    day36 08-Hibernate抓取策略:批量抓取

    本篇主要关注的是Hibernate的抓取策略,特别是批量抓取技术,这对于提高应用程序性能至关重要。批量抓取能够减少数据库交互次数,从而优化查询效率。 首先,我们要理解什么是抓取策略。在Hibernate中,抓取策略是指...

    day36 07-Hibernate抓取策略:many-to-one上的抓取策略

    今天我们要讨论的是Hibernate框架中的一个关键概念——抓取策略,特别是针对"many-to-one"关系的抓取策略。这篇博客将深入剖析这个主题,帮助你更好地理解和应用Hibernate。 Hibernate是Java领域中最流行的对象关系...

    HIBERNATE检索策略

    描述:本文深入解析了HIBERNATE的检索策略,为读者提供了一条清晰的学习路径,重点分析了HIBERNATE中的抓取策略及其应用场景,帮助开发者更有效地管理和优化数据加载过程。 在HIBERNATE框架中,检索策略主要涉及...

    hibernate3数据检索、抓取策略 、 注解的使用

    hibernate3数据检索、抓取策略 、 注解的使用

    Hibernate提升性能Hibernate提升性能

    本章主要探讨了如何通过不同的抓取策略来提升Hibernate的性能。抓取策略涉及到当应用程序需要处理对象间的关联时,Hibernate如何有效地获取关联数据。 首先,连接抓取(Join fetching)是一种通过在SELECT语句中...

    Hibernate中的多表查询及抓取策略

    2. **Hibernate中的抓取策略** 抓取策略涉及到何时以及如何加载关联对象,以优化数据库交互: - **延迟加载(Lazy Loading)**:默认情况下,Hibernate采用延迟加载,即在查询时不加载关联对象,而是在实际访问...

    Hibernate实战(第2版)高清

    你将直接深入到Hibernate的富编程模型之中,贯穿映射、查询、抓取策略、事务、会话、缓存以及更多其他内容。书中图文并茂地介绍了数据库设计和优化技术的实践。在本书中,作者详尽介绍了具有Java持久化2.1标准的...

    Hibernate框架 jar 架包 开发详解

    Hibernate 简介 Hibernate 开发流程 Hibernate 配置文件 Hibernate 核心接口和类 Hibernate ORM映射 HQL Hibernate 懒加载机制与抓取策略 Hibernate 缓存 Hibernate 锁机制

    Hibernate_day04.zip

    在Hibernate Day 04的学习中,我们深入探讨了如何利用Hibernate进行查询操作以及它的抓取策略,这些是理解并有效使用Hibernate的关键部分。 首先,让我们来详细了解一下Hibernate的查询方式。Hibernate提供了一个...

    Hibernate3性能优化 Hibernate_regerence3.12

    有很多人认为Hibernate天生效率比较低,确实,在普遍情况下,需要将执行转换为SQL语句的 Hibernate 的效率低于直接JDBC存取,然而,在经过比较好...Hibernate的优化策略: 1.抓取优化 2.二级缓存 3.批量数据操作 4.杂项

    Hibernate5中文用户使用手册

    包括基础抓取知识和应用抓取策略,例如通过查询和配置文件动态抓取数据。 批处理:Hibernate支持JDBC批处理,以提高批量数据操作的性能。 缓冲:讲解了如何配置二级缓冲以及管理缓冲数据。 拦截器和事件:这部分...

    Hibernate5用户手册中文版

    9. Fetching(抓取)章节,说明了如何配置和应用不同的抓取策略来优化数据库访问和提升性能。包括不抓取、通过查询动态抓取、通过配置文件动态抓取等策略。 10. 批处理章节,展示了如何通过JDBC批处理来执行批量...

    Hibernate关键知识点大全

    - 抓取策略包括单个对象、集合的懒加载和Eager加载等,影响数据的获取时机。 11. **事务隔离级别** - 事务的隔离级别包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ...

    Hibernate5 的用户手册中文版

    以上内容是Hibernate5用户手册中文版的一部分知识点,涵盖了从基础的体系架构介绍到复杂的数据抓取策略和事务控制管理。手册为开发者提供了使用Hibernate进行数据持久化的全面指导,帮助开发者更好地理解和应用该...

    Hibernate5.2.11高清版,最新版本

    抓取策略(Fetching)介绍了Hibernate如何抓取对象及其关联对象,包括延迟加载和立即加载的策略选择。 批量操作(Batching)涉及如何执行数据库批处理操作,这对于执行大量数据更新或插入非常有用。 缓存机制...

    hibernate_reference

    这些配置属性包括SQL方言、外连接抓取、二进制流、二级和查询缓存、查询语言替代、Hibernate统计信息和日志系统。此外,文档还提供了如何实现命名策略和持久化类提供者的指导。文档最后提及了Hibernate的XML配置文件...

Global site tag (gtag.js) - Google Analytics