hibernate框架04对象状态检索_第1页
hibernate框架04对象状态检索_第2页
hibernate框架04对象状态检索_第3页
hibernate框架04对象状态检索_第4页
hibernate框架04对象状态检索_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

04对象状态、hibernate检索策略、Hibernate检索对象的方式1教学内容2Session缓存的作用Session清理缓存的时间点对象的临时状态、持久状态和游离状态用session的update()方法使游离对象转变为持久化对象。延迟装载迫切左外链接HQL检索方式QBC检索方式本地SQL检索方式理解session的缓存3当session的save()方法持久化一个Customer对象时,Customer对象被加入到Session的缓存中,以后即使应用程序中的引用变量不再引用

Customer对象,只要session缓存没有被清空,

Customer对象仍然处于生命周期中。当session的load方法试图从数据库中加载一个

Customer对象时,session先会判断缓存中是否存在这个Customer对象,如果存在就不需再从数据库中检索。4理解session的缓存Transaction

tx

=session.beginTransaction();Customer

cus

=new

Customer();cus.setName("TonyTest");//Customer对象被持久化,并且加入到session的缓存中

session.save(cus);//获取当前Customer对象的OIDlong

cusid=cus.getId();//设定cus不再引用Customer对象

cus=null;//从Session中读取Customer对象Customer

cusb

=

(Customer)session.load(Customer.class,

cusid);mit();//关闭session,清空缓存

session.close()//访问Customer对象

System.out.println(cusb.getName());//cusb设定为不再引用Customer对象,此时Customer对象的生命周期结束cusb

=

null;Session缓存的作用5减少访问数据库的频率。应用程序从内存中读取持久化对象的速度显然比从数据库中读取的速度要快得多,因此session的缓存可以提高数据的访问性能。保证缓存中的对象与数据库中相关记录保持同步。当缓存中持久化对象的属性发生了变换,session不会立即执行相关的SQL语句,这使得session能够将多个相关的sql语句合并为一条SQL语句,以便减少访问数据库的次数,从而提高应用程序的

性能。Session清理缓存6清理缓存是指按照缓存中对象的属性的变化来同步更新数据库例如以下程序:tx

=

session.beginTransaction();Customer

customer

=(Customer)session.load(Customer.class,

1);customer.setName("jack");customer.setName("mike");mit();当session清理缓存时,只会执行一条SQL语句:update

Customer

set

name

=

'mike'

...清理缓存的时间点7Session会在下面的时间点上清理缓存:当应用程序调用org.hibernate.Transaction的commit()方法的时候,commit()方法先清理缓存,然后再向数据库提交事务。当应用程序调用session的query方法时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能反映持久化对象的最新状态。当应用程序显示调用session的flush()方法时。Hibernate的二级缓存结构8Hibenrate提供两级缓存,第一级就是session的缓存。由于session对象的生命周期通常对应一个数据库事务或一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必须的。在第一级缓存中,持久化类的每个实例都具有唯一的OID。第二级缓存是一个可以插拔的缓存插件,它由

SessionFactory负责管理,由于SessionFactory对象的生命周期和应用程序的生命周期对应,因此第二级缓存是进程范围或群集范围的缓存。这个缓存中存放的是对象的散装数据。第二级缓存是可选的,可以在每个类或每个集合的粒度上配置第二级缓存。Hibernate的二级缓存结构9Hibernate的二级缓存机制如果在事务范围的缓存(第1级缓存)中没有查询到相应的数据,还可以到进程序范围或群集范围的缓存(2级缓存)中查询,如果在进程范围的缓存内也没有找到对应的数据,那么就只好查询数据库。10hibernat3.3中设置11<propertyname="cache.use_second_level_cache">false</property><propertyname="vider_class">org.hibernate.cache.EhCacheProvider</property><propertyname="cache.use_query_cache">false</property>Hibernate中java对象的状态12临时状态(transient):刚刚用new语句建立,还没有被持久化,不处于session的缓存中。处于临时状态的java对象称之为临时对象。持久化对象(persistent):已经被持久化,加入到session的缓存中。处于持久化状态的java对象被称之为持久化对象。游离状态(detached):已经被持久化,但不再处于session的缓存中。处于游离状态下的Java对象被称之为游离对象。对象状态之间的转换1314Customer对象的转换过程程序代码Customer对象的生命周期Customer对象的状态tx

=session.beginTransaction();Customer

cus

=

new

Customer();开始生命周期临时状态session.save(cus)处理生命周期中转变为持久化对象Long

cid

=

cus.getId();cus

=

null;Customer

cusb

=(Customer)session.load(Customer.class,

cid);mit()处理生命周期中处理持久化状态session.close()处于生命周期中转为游离状态System.out.println(cusb.getName())处于生命周期中处于游离状态cusb

=

null结束生命周期结束生命周期使用session的update方法关联游离对象15Session

session=sf.getCurrentSession();Transaction

tx=session.beginTransaction();Customer

cus=new

Customer();//临时状态

cus.setName("Tony");session.save(cus);//持久化状态

mit();session.close();//修改游离态的Customer对象

cus.setName("ModTonyName");Session

session2

=

sf.getCurrentSession();Transaction

txb=session2.beginTransaction();session2.update(cus);//关联游离态的对象

mit();//保存更新session2.close();Session

Update方法的操作:把customer对象重新加入到session缓存中,使它变为持久化对象。计划执行一个update语句。实际执行是在清理缓存时执行。表现层与业务之间传递值对象和游离对象的过程16在一对多的关联级别使用延迟检索策略17class和set都可以设置为延迟检索策略。

Hibernate3缺省的使用延迟检索策略,而

hibernate2缺省的为立即检索。还有一种预先抓取的策略对于对象用于延迟检索时,初始化对象时只有oid,只有当访问除oid之外的属性时才执行装载工作。对于set集合,当访问集合对象元素时才执行实际的装载。注意:只有持久化状态下的对象才可以执行延迟装载。延迟检索策略的优缺点18优点由应用程序决定需要加载那些对象,可以避免执行多余的select语句,以及避免加载应用程序不需要的访问对象。因此能提高检索性能,并能节省内存空间。缺点应用程序如果希望访问游离的代理类实例,必需保证它在持久化状态时已被初始化。适用范围一对多或者多对多关联。复杂对象。应用程序不需要立即访问或根本不会访问的对象。在多对一级联级别使用迫切左外联接19默认情况下,多对一关联时使用迫切左外联接检索策略(预先加载)。也可以在设置<many-to-one>元素时将其属性:out-join设置为true或false来决定是否使用迫切左外联接(不能与fetch="select"共用)。迫切左外联接20优点对应用程序完全透明,不管对象是持久化状态还是游离状态都可以方便的从一个对象导航到另外一个对象。使用外联接,减少了select语句数。缺点可能会加载应用程序不需要访问的对象,白白浪费许多的内存空间。复杂的数据库表连接会影响检索的性能。动态使用迫切左外联接21例:from

Order

as

a

left

join

fetch

a.customerHibernate提供检索对象的方式22导航对象图检索方式根据已经加载的对象,导航到其它的对象,例如:对于已加载的Customer对象,可以通过getOrders()导航到它所有的订单。OID检索方式:HQL检索方式使用面向对象的HQL查询语言,Query接口提供了对hql查询的功能。QBC检索方式:使用QBC(Querybycriteria)API来检索对象。这种API封装了基于字符串形式的查询语句提供了更加面向对象的接口中。本地SQL检索方式:使用本地数据库相关的SQL进行查询,hibernate负责将查询的结果集映射到持久化对象。HQL查询方式23HQL(hibernatequery

language)是面向对象的查询语言,它与SQL查询语言有些相似。在hibernate提供的各种检索方式中,hql的使用最为广泛的一种检索方式。它具有以下功能:在查询语句中设定各种查询条件支持投影查询,即仅检索出对象的部分属性支持分页查询支持连接查询支持分组查询,充许使用having和group

by

关键字提供内置聚集函数,例如:sum,min,max等能够调用用户定义的SQL函数支持子查询,即嵌入式查询支持动态绑定参数HQL检索的步骤24//创建一个query对象Query

query

=

session.createQuery("from

Customer

as

awhere

=

:cusname");Query

query2

=

session.createQuery("from

Customer

as

awhere

=

?");//动态绑定参数

query.setString("cusname","Tony");query2.setString(0,"Tony");//执行查询,返回结果集

List

result=query.list();使用方法链接编程风格25List

result

=

session.createQuery("...").setString("cusname","tony").list();使用方法链编程风格可使代码更加简洁。QBC检索方式26//建立一个Criteria对象Criteria

criteria

=

session.createCriteria(Customer.class);//设定查询条件,然后把条件加入到criteria中Criterion

cria=Restrictions.like("name","T%");Criterion

crib

=

Restrictions.eq("age",

new

Integer(13));Criterion

cric

=

Restrictions.

between("age",23,30)or条件查询设置Criterion

criab

=

Restrictions.or(cria,crib)//也可以使用方法链接编程风格

criteria.add(cria).add(crib);//执行查询,返回结果对象集

List

result=criteria.list();SQL检索方式27采用HQL或QBC检索方式时。hibernate会生成标准的SQL查询语句,适用于所有数据库平台,因此这两种检索方式都是跨平台的。有的应用程序可能需要根据底层数据库的SQL方言,来生成一些特殊的查询语句。在这种情况下,可以利用hibernate提供的sql检索方式。//创建Query对象Query

query

=

session.createSQLQuery("select

c.*

from

CUSTOMERS

cwhere

like

:cusname

and

c.age=

:cusage").addEntity(Customer.class);//动态绑定参数

query.setString("cusname","%T%");query.setInteger("cusage",12);//执行查询返回结果

List

result=query.list();Query和Criteria接口都提供了用于分页显示查询结果的方法setFirstResult(intfirstResult):设定从哪一个对象开始检索,参数firstResult表示这个对象在查询中的索引位置,索引位置的起始值为0。默认情况下,query和Criteria接口从查询结果中的第一个对象,也就是索引位置为0的对象开始检索setMaxResults(intmaxResults):设定一次最多检索出的对象数目。默认情况下,Query和Criteria接口检索出查询结果中所有的对象28分页查询分页查询29//采用HQL检索方式

Queryquery=session.createQuery(“from

Customer

c

orderby

asc”);query.setFirstResult(0);Query.setMaxResults(10);List

result

=

query.list();//采用QBC检索方式

Criteria

criteria=session.createCriteria(Customer.class);criteria.addOrder(Order.asc(“name”));criteria.setFirstResult(0);criteria.setMaxResults(10);List

result

=

criteria.list();以下两种检索方式是等价的,它们都能同时迫切左外连接类B和类C://HQL迫切左外连接检索方式from

A

a

left

join

fetch

a.b

b

left

join

fetch

a.c

c

where

b

is

not

null

and

c

isnot

null//QBC迫切左外连接检索方式List

result

=

session.createCriteria(A.class).setFetchMode(“this.b”,FetchMode.EAGER).setFetchMode(“this.c”,FetchMode.EAGER).add(Expression.isNotNull(“this.b”)).add(Expression.isNotNull(“this.c”))

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论