`

Hibernate之数据加载方式

阅读更多

Hibernate 的数据加载方式:

在JDBC的操作中,利用SQL语句加载所需要的数据进行处理,当SQL提交之后,这些数据就被读取待用;

在Hibernate中,我们有更多的选择;HIbernate中的数据记载方式:

  • 及时加载(Immeddiate Loading)

当实体加载完后,立即加载其相关联数据;

  • 延迟加载(Lazy Loading)

实体加载时,并不会立即加载其数据,而是当第一次访问的时候,在进行读取;

  • 预先加载(Eager Loading)

实体与其关联对象同时读取,这与即时加载类似,不过实体及其相关数据是通过一条SQL语句读取到得!(基于外连接);

  • 批量加载(Batch Loading)

对于即时加载和延迟加载,可以采用批量加载方式进行性能上的优化;

 

测试:

及时加载:

private static void queryTest() {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		final String hql = "from TUser where name = 'keith'";
		List<TUser> users = session.createQuery(hql).list();
		System.out.println("query finished!!!");
		Iterator<TUser> it = users.iterator();
		while (it.hasNext()) {
			TUser user = it.next();
			System.out.println("user's name:"+user.getName());
			System.out.println("user's address:"+user.getAddresses().size());
		}
		session.getTransaction().commit();
	}

 看下SQL的执行顺序:

select   tuser0_.userid as userid1_, tuser0_.name as name1_  from    TUser tuser0_   where    tuser0_.name='keith'
select   addresses0_.user_id as user3_1_1_,addresses0_.addressId as addressId1_,addresses0_.addressId as addressId0_0_,addresses0_.info as info0_0_ from   TAddress addresses0_ where addresses0_.user_id=?

query finished!!!
user's name:keith
user's address:2

 首先会加载实体类的所有内容,然后在加载其相关的数据!

 


延迟加载:

在及时加载中,当Hibernate加载TUser对象时,即同时加载了其所关联的TAddress对象,这样就可能会导致性能的降低,例如:我们只想要TUser的信息,并不想要TAddress的信息,如果按照及时加载的话,就将TAddress又查询了,导致性能降低!如果用延迟加载就可以解决这一问题;

延迟加载只需要在<set />标签中加个属性即可:

		<set name="addresses" cascade="all" lazy="true">
			<key column="user_id" />
			<one-to-many class="TAddress"/>
		</set>

 看下SQL的执行顺序:

select  tuser0_.userid as userid1_, tuser0_.name as name1_ from   TUser tuser0_   where  tuser0_.name='keith'
query finished!!!
user's name:keith
select addresses0_.user_id as user3_1_1_,addresses0_.addressId as addressId1_,addresses0_.addressId as addressId0_0_,addresses0_.info as info0_0_ from  TAddress addresses0_ where addresses0_.user_id=?

什么时候需要它,什么时候才发SQL查询它!

预先加载:

预先加载通过outer-join完成关联数据的加载,这样,通过一条SQL即可完成实体及其关联数据的读取操作 ,如果要是多条数据的话,这样会节省很大的资源;不过在集合类型中(一对多,多对一,或者多对多关系中),不推荐采用预先加载方式,对于集合,如果条件允许,我们应该尽量避免延迟加载;以避免性能生的不必要开销!

一般来说,outer-join可以高效的处理关联数据。但在一些特殊的情况下,特别是比较复杂的关联关系情况下;如多层管理,hibernate生成的的outer-join可能复杂,此时我们应该根据情况判断采用预先加载在当前环境的可用性;同时也可以通过调整全局变量限定outer-join的层次;

 

批量加载

是通过批量提交多个限定条件,一次完成多个SQL的读取;

当我们在被查询的类上添加一个 batch-size="3"属性时,指定批量查询的数量;就可以进行批量查询;

我们对TUser进行批量查询,其*.hbm.xml这样:

<hibernate-mapping package="com.keith.dataLoad">
	<class name="TUser" table="TUser" batch-size="3">
		<id name="userid">
			<generator class="native" />
		</id>
		。。。。
	</class>
</hibernate-mapping>
 

我们的测试类这样写:

		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		final String hql = "from TUser";
		List<TUser> users = session.createQuery(hql).list();
		Iterator it = users.iterator();
		while (it.hasNext()) {
			TUser user = (TUser) it.next();
			System.out.println(user);
		}
		session.getTransaction().commit();
	

 但是会发出2条SQL;(因为我的SQL里就有2条数据)

输出结果:

com.keith.dataLoad.TUser@8ae45a
com.keith.dataLoad.TUser@29c204
 

 

 

 

分享到:
评论

相关推荐

    Hibernate 延迟加载剖析与代理模式应用

    通过延迟加载技术可以避免过多、过早地加载数据表里的数据,从而降低应用的内存开销。Hibernate 的延迟加载本质上就是代理模式的应用,当程序通过 Hibernate 装载一个实体时,默认情况下,Hibernate 并不会立即抓取...

    Hibernate延迟加载

    hibernate延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作!

    hibernate优化前的程序

    hibernate优化前的程序,Hibernate 延时加载,Hibernate数据加载方式

    最简单的Hibernate工程

    一个最简单的Hibernate工程,可通过hibernate.cfg.xml或者hibernate.properties加载数据源并对对象操作,下载后可直接导入eclipse运行

    最简单Hibernate工程代码

    最简单的Hibernate工程代码,可通过hibernate.cfg.xml或者hibernate.properties加载数据源,此工程下载后可直接导入eclipse运行

    spring hibernate 日志管理插件

    数据日志:设计中提供数据日志注入接口,管理数据日志注入,业务系统可过基于hibernate Listener 拦截数据表操作,注入数据日志(此为业务系统实现,设计中提供数据日志注入接口),提供 日志管理:通过统一的...

    深入浅出Hibernate(PDF)第一部分

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...

    Hibernate 简单使用 hibernate, ppt

    实体对象识别 PO与VO Hibernate持久化实现 数据加载方式 Ms-jdbc异常处理 参数绑定

    hibernate操作数据库笔记

    //该方法会立即加载/获取数据(只要调用该方法就会立即向数据库发出查询语句),该方法只在内部缓存查找数据,如果内部缓存中没有数据就直接去数据库查询,当数据库中没有要查询的数据时返回null (6).load(Class ...

    springmvc+hibernate 日志管理工具

    数据日志:设计中提供数据日志注入接口,管理数据日志注入,业务系统可过基于hibernate Listener 拦截数据表操作,注入数据日志(此为业务系统实现,设计中提供数据日志注入接口),提供 日志管理:通过统一的...

    深入浅出Hibernate.pdf

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...

    深入浅出Hibernate(PDF)第二部分

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...

    Hibernate+中文文档

    3.2. Hibernate数据源属性 3.3. Hibernate配置属性 3.4. Hibernate JDBC和连接(connection)属性 3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) ...

    深入浅出hibernate(PDF)第三部分

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...

    hibernate基础教程

    如果没有,再到数据库中去加载.从缓存中读取信息的速度会远远大于从数据库中读取信息的速度. 如图: (1) 没有缓存的情况: 写 ...

    hibernate查询

    hibernate的查询,对象状态以及数据加载方式

    Hibernate_Tools_for_eclipse_HbmTool.rar

    完成后,你就可以在Hibernate Configuration视图窗口看到配置项,已经链接到数据,并把你数据库中的表列出来,如果在这一步你没有成功的话,请检查你是否以正确安装的Hibernate Tools和JBoos Tools这个很重要;...

    深入浅出Hibernate

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用...

    Hibernate实战(第2版 中文高清版)

    第一部分 从Hibernate和EJB 3.0开始  第1章 理解对象/关系持久化   1.1 什么是持久化   1.1.1 关系数据库   1.1.2 理解SQL   1.1.3 在Java中使用SQL   1.1.4 面向对象应用程序中的持久化   1.2 范式不...

Global site tag (gtag.js) - Google Analytics