Hibernate 的数据加载方式:
在JDBC的操作中,利用SQL语句加载所需要的数据进行处理,当SQL提交之后,这些数据就被读取待用;
在Hibernate中,我们有更多的选择;HIbernate中的数据记载方式:
当实体加载完后,立即加载其相关联数据;
实体加载时,并不会立即加载其数据,而是当第一次访问的时候,在进行读取;
实体与其关联对象同时读取,这与即时加载类似,不过实体及其相关数据是通过一条SQL语句读取到得!(基于外连接);
对于即时加载和延迟加载,可以采用批量加载方式进行性能上的优化;
测试:
及时加载:
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.cfg.xml或者hibernate.properties加载数据源并对对象操作,下载后可直接导入eclipse运行
最简单的Hibernate工程代码,可通过hibernate.cfg.xml或者hibernate.properties加载数据源,此工程下载后可直接导入eclipse运行
数据日志:设计中提供数据日志注入接口,管理数据日志注入,业务系统可过基于hibernate Listener 拦截数据表操作,注入数据日志(此为业务系统实现,设计中提供数据日志注入接口),提供 日志管理:通过统一的...
本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...
实体对象识别 PO与VO Hibernate持久化实现 数据加载方式 Ms-jdbc异常处理 参数绑定
//该方法会立即加载/获取数据(只要调用该方法就会立即向数据库发出查询语句),该方法只在内部缓存查找数据,如果内部缓存中没有数据就直接去数据库查询,当数据库中没有要查询的数据时返回null (6).load(Class ...
数据日志:设计中提供数据日志注入接口,管理数据日志注入,业务系统可过基于hibernate Listener 拦截数据表操作,注入数据日志(此为业务系统实现,设计中提供数据日志注入接口),提供 日志管理:通过统一的...
本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...
本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...
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) ...
本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用技术...
如果没有,再到数据库中去加载.从缓存中读取信息的速度会远远大于从数据库中读取信息的速度. 如图: (1) 没有缓存的情况: 写 ...
hibernate的查询,对象状态以及数据加载方式
完成后,你就可以在Hibernate Configuration视图窗口看到配置项,已经链接到数据,并把你数据库中的表列出来,如果在这一步你没有成功的话,请检查你是否以正确安装的Hibernate Tools和JBoos Tools这个很重要;...
本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用...
第一部分 从Hibernate和EJB 3.0开始 第1章 理解对象/关系持久化 1.1 什么是持久化 1.1.1 关系数据库 1.1.2 理解SQL 1.1.3 在Java中使用SQL 1.1.4 面向对象应用程序中的持久化 1.2 范式不...