`
gqzyyxh
  • 浏览: 9597 次
  • 性别: Icon_minigender_1
  • 来自: 常州
文章分类
社区版块
存档分类
最新评论

Hibernate持久层操作

阅读更多
1,数据加载

1),Session.get/load
区别:(1),未发现符合条件的记录:get-->null,load-->ObjectNotFoundException。
(2),load可返回实体的代理类实例,get永远直接返回实体类。
(3),load-->内部缓存-->二级缓存-->SQL(DB),get-->内部缓存-->SQL(DB)。

Session加载实体对象时经过的过程:
内部缓存(查找数据)-->NonExists(查找查询条件)-->第二级缓存(load方法)-->Select SQL(DB)-->根据Result创建对应的数据对象-->将其数据对象纳入当前Session实体管理容器(内部缓存)-->执行Interceptor.onLoad-->纳入二级缓存-->如果数据对象实现了LifeCycle接口,则调用数据对象的onLoad方法-->返回数据对象。

2),Session.find/iterate
Session.find()------->session.createQuery().list()-----无法利用缓存,它对缓存只写不读。
Session.iterate()---->session.createQuery().iterate()-----可以充分利用缓存。
-------基于充分利用缓存以提升性能上的考量。
内存使用上的考虑:对海量数据进行操作,find方法一次获得所有的记录并将其读入内存-->内存消耗甚至OutOfMemoryError。
解决方案之一:逐条对记录进行处理,将内存消耗保持在可以接受的范围之内。
String hql = "from TUser where age > ?";
Iterator it = session.iterate(hql,new Integer(18),Hibernate.INTEGER);
while(it.hasNext()){
TUser user = (TUser)it.next();
session.evict(user);//将对象从一级缓存中移除
sessionFactory.evict(TUser.class,user.getId());//将对象从二级缓存中移除
}
解决方案之二:SQL或存储过程。

3),Query Cache
---中保存了之前查询操作执行过的Select SQL,以及由此查询产生的查询结果集(包括查询对象的类型和id)。

根据查询SQL--->从Query Cache中检索--->取出这个SQL的检索结果集--->根据这个结果集中对象类型及其id,从缓存中取出对赢得实体对象返回。

Query Cache只在特定的情况下产生作用:
(1),完全相同的Select SQL重复执行。
(2),在两次查询之间,此Select SQL对应的库表没有发生过改变。

<hibernate-configuration>
<session-factory>
....
<property name="hibernate.cache.use_query_cache">true</property>
....
</session-factory>
<hibernate-configuration>

String hql="from TUser where age > ?";
Query query = session,createQuery(hql).setInteger(0,20);
query.setCacheable(true);

List userList = query.list();
int len = userList.size();
for(int i=0;i<len;i++){
TUser user = (TUser)userList.get(i);
}

query = session2.createQuery(hql).setInteger(0,20);
query.setCacheable(true);//第二次查询时,也必须将Cacheable设为true

userList = query.list();
len = userList.size();
for(int i=0;i<len;i++){
TUser user = (TUser)userList.get(i);
}
看到第二次查询时,Hibernate并没有执行任何Select SQL即完成了任务,这就是Query Cache的作用。

4),延迟加载(Lazy Loading)
---为了避免在某些情况下,关联关系所带来的无谓的性能开销。---即在需要数据的时候,才真正执行数据加载操作。

Hibernate2延迟加载实现主要针对:(1),实体对象;(2),集合。
Hibernate3同时提供了属性的延迟加载功能。

(1),实体对象的延迟加载
<class ... laze="true"> ---Hibernate2中,laze属性默认为false,Hibernate3中其默认值为true。
Hibernate的代理机制:Hibernate中引入了CGLib作为代理机制实现的基础。CGLib可以在运行期动态生成Java Class,这里的代理机制,其基本实现原理就是通过由CGLib构造一个包含目标对象所有属性和方法的动态对象(相当于动态构造目标对象的一个字类)返回,并以之作为中介,为目标对象提供更多的特性。真正的TUser对象位于代理类的CGLIB$CALLBACK_0.target属性中。
-----只有当客户程序真正调用实体类的取值方法时,Hibernate才会执行数据库查询操作。

(2),集合类型的延迟加载
<set ... lazy="true">
Hibernate.initialize方法可以强制Hibernate立即加载关联对象集。
Hibernate.initialize(user.getAddresses());
session.close();
//通过Hibernare.initialize方法强制读取数据,addresses对象即可脱离session进行操作
Set hset = user.getAddresses();
TAddress addr = (TAddress)hset.toArray()[0];

(3),属性的延迟加载
<property ... lazy="true">
与实体和集合类型的延迟加载不同,Hibernate3属性延迟加载机制在配置之外,还需要借助类增强器对二进制Class文件进行强化处理。

5),数据保存

Session.save方法用于实体对象到数据库的持久化操作。
包含步骤:在Session内部缓存中寻找待保存对象-->lifecycle(onSave())-->Validatable(validate())-->Interceptor.onSave()-->构造Insert SQL-->user.id=new id-->将user对象放入内部缓存-->对级联关系进行递归处理。

Session.update:根据待更新实体对象的Key在当前session的内部缓存中进行查找(一个Persistent实体对象调用update并不会产生作用)-->初始化实体对象的状态信息(作为之后脏数据检查的依据),并将其纳入内部缓存。

Session.saveOrUpdate:实际上是save和update方法的组合应用,它本身并没有增加新的功能特性,但是却为我们的应用层开发提供了一个相当便捷的功能选择。--无需关心传入的user参数到底是怎样的状态。
public interface IUserDAO{
public TUser getUser(String id);
public void saveUser(TUser user);
}

6),数据批量操作

(1),数据批量导入
<session-factory>
...
<property name="hibernate.jdbc.batch_size">25</property>
...
</session.factory>

public void importUserList() throws HibernateException{
Transaction tx = session.beginTransaction();
for(int i=0;i<10000;i++){
TUser user = new TUser();
user.setName("user" + i);
session.save(user);

if(i%25==0){ //以每25个数据作为一个处理单元
session.flush();
session.clear();
}
}
tx.commit();
}

(2),数据批量删除

内存消耗:
Transaction tx = session.beginTransaction();
String hql = "from TUser";
Query query = session.createQuery(hql);
ScrollableResults scRes = query.scroll();
while(scRes.next()){
TUser user = (TUser)scRes.get(0);
session.delete(user);
}
tx.commit();

迭代删除操作的执行效率:采用调整hibernate.jdbc.batch_size参数来解决。

BULK delete/update:
Transaction tx = session.beginTransaction();
String hql = "delete TUser";
Query query = session.createQuery(hql);
int ret = query.executeUpdate();
tx.commit();
--------批量删除与缓存管理的矛盾仍然存在。---关闭二级缓存,调用不同session解决内部缓存带来的问题。

7),Collection

(1),Collection类型(org.hibernate.collection)
无序集:Set,Bag,Map
有序集:List
---无序与有序,是针对Hibernate数据持久过程中,是否保持数据集合中的记录排列输序加以区分的。

Set:
陷阱--->
<set name="addresses" table="t_address" lazy="false">
<key column="user_id"/>
<one-to-many class="TAddress"/>
</set>
<set name="addresses" table="t_address" lazy="false">
<key column="user_id"/>
<element type="string" column="address"/>
</set>

Bag:允许包含重复元素的“Set”。---基于List但屏蔽其有序性。
idbag:
<idbag name="addresses" lazy="true" table="t_address">
<collection-id type="int" column="id">
<generator class="identity"/>
</collention-id>
<key column="user_id">
<element type="string" column="address"/>
</idbag>

Map:键值对应关系。
<map name="addresses" lazy="true" table="t_address">
<key column="user_id"/>
<index type="string" column="type"/>
<element type="string" column="address"/>
</map>
index:要求在数据集中取值唯一。
TUser user = (TUser)session.load(TUser.class,new Integer(1));
user.getAddresses().get("Home");//读取家庭地址
user.getAddresses().get("Office");//读取办公地址

List:实现了集合内元素顺序的持久化。
<list name="addresses" lazy="true" table="t_address">
<key column="user_id"/>
<index type="integer" column="idx"/>
<element type="string" column="address"/>
</list>

8),结果集排序
排序强调的是针对现有数据,以特定的逻辑对其排列此序进行调整,而排序的结果,是数据在内存中的某种排列次序,属于临时状态。

排序方式:
Sort--->Collection中的数据排序,如对一个List中的元素先后进行排序调整。(JVM)
<set ... sort="natural".../>
如果期望指定某种特殊的排序算法,那么可以实现java.util.Comparator接口,如:
package org.sample
public class LengthComparator implements Comparator{
public int compare(Object obj1,Object obj2){
String str1 = String.valueOf(Obj1);
String str2 = String.valueOf(Obj2);
return str1.length()-str2.length();
}
}
<set ... sort="org.sample.LengthComparator".../>
---Bag,List不支持sort排序方式。

order-by--->对数据库执行Select SQL时,由order by子句实现的数据排序方式。(数据库)
<set ... order-by="address desc".../>
List不支持order-by排序。
分享到:
评论

相关推荐

    Hibernate执行持久层访问步骤

    《Hibernate执行持久层访问步骤详解...以上就是Hibernate执行持久层访问的基本步骤,掌握这些知识点,能帮助开发者高效地进行数据库操作。在实际开发中,还需要结合具体业务需求灵活运用,不断优化代码,提升系统性能。

    Hibernate持久层方法汇总

    本文将详细介绍Hibernate持久层中的一些核心方法,包括`session.load`, `session.find`, `session.iterator`, `session.save`, `session.update`, `session.saveorupdate`。 1. `session.load()`: - `load()`方法...

    hibernate 持久层优化

    使用Hibernate进行持久层操作时,如何优化查询响应时间和提高性能成为了一个重要的课题。本文将根据给定的文件内容,详细阐述在持久层设计方面可以采取的关键优化措施。 #### 二、减少对数据库的访问 设计优秀的...

    Hibernate操作持久化对象

    Hibernate 操作持久化对象是Java开发中用于简化数据库交互的重要工具。它是一个开源的Java持久化框架,由Gavin King创建,并逐渐发展成为Java世界中主流的持久化解决方案。Hibernate的核心在于提供对象-关系映射(ORM...

    Hibernate 基于持久层框架的DAO模式应用

    在基于持久层框架的DAO(Data Access Object)模式应用中,Hibernate扮演着核心角色,使得业务逻辑和数据访问逻辑分离,提高了代码的可复用性和可维护性。 1. **DAO模式的理解** DAO模式是一种设计模式,它创建了...

    基于Hibernate的持久层增强工具包设计源码

    Hibernate增强工具包专注于对Hibernate持久层的增强,提供更加精简的CRUD(创建、读取、更新、删除)操作,同时保持对Hibernate核心功能的兼容。项目结构清晰,代码注释详尽,适合用于学习和研究Hibernate在Java应用...

    使用Hibernate快速实现持久层处理的实例工程源代码

    标题"使用Hibernate快速实现持久层处理的实例工程源代码"表明,这个项目主要聚焦于展示如何高效地利用Hibernate框架来完成数据库操作。Hibernate的核心特性包括自动映射Java对象到数据库表、事务管理以及强大的查询...

    用 Hibernate 和 Spring 开发持久层

    ### 使用Hibernate和Spring开发持久层的关键知识点 #### 引言 在现代企业级应用开发中,数据持久化是一项核心需求,而使用Hibernate和Spring构建事务持久层成为了许多开发者的选择。Hibernate,作为一款强大的对象...

    4--3-阶段-基于MyBatis&Hibernate实现持久层开发整合--300.docx

    本教程主要关注基于MyBatis和Hibernate的Java持久层开发整合,这是Java EE企业级应用开发中的重要组成部分。MyBatis是一个优秀的SQL映射框架,它简化了数据库操作,而Hibernate是一个对象关系映射(ORM)框架,它...

    Hibernate数据持久层jar包源码解析

    《Hibernate数据持久层jar包源码解析》 在软件开发中,数据持久层是系统架构中的关键部分,它负责将应用程序的数据与数据库进行交互。Hibernate作为一款强大的Java对象关系映射(ORM)框架,极大地简化了这个过程。...

    基于Hibernate的数据持久层关键技术的研究

    ### 基于Hibernate的数据持久层关键技术的研究 #### 一、引言 随着软件开发的不断进步和技术的发展,越来越多的企业级应用需要高效地管理和访问大量数据。为了更好地满足这一需求,许多开发团队选择了使用ORM...

    Hibernate数据持久层框架.rar

    是一款持久层框架,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA的对象关系映射(ORM)模型是基于Hibernate。是一款面向对象的ORM框架,JPA不...

    Hibernate数据持久层框架 v6.4.4.zip

    Hibernate是一款强大的Java持久层框架,它极大地简化了数据库操作,使得开发者可以更加专注于业务逻辑的实现,而非繁琐的SQL语句编写。Hibernate v6.4.4是该框架的一个重要版本,提供了诸多改进和新特性,对于学习和...

    信息系统软件设计:第5章 Hibernate持久层技术(3).ppt

    【信息系统软件设计】中的持久层技术是数据库交互的关键部分,而Hibernate作为一种流行的Java持久层框架,简化了这一过程。在第5章中,主要讲解了如何利用Hibernate进行数据查询,特别是通过Hibernate Query ...

    基于Java的Hibernate和JPA持久层框架设计源码

    本项目为“基于Java的...项目利用Hibernate和JPA技术,为开发者提供了一套完整的持久层解决方案,支持对象关系映射(ORM)和数据持久化操作,适用于各种Java应用场景。项目结构清晰,代码注释详尽,易于理解和集成。

    hibernate持久化对象生命周期[参照].pdf

    它允许开发者使用面向对象的编程方式来处理数据库操作,极大地简化了数据访问层的复杂性。本文将深入探讨Hibernate中的持久化对象生命周期,包括瞬时对象、持久化对象和游离对象的状态转换及其特性。 1. 瞬时对象...

    持久层hibernate详解

    ### 持久层Hibernate详解 #### 一、什么是Hibernate? Hibernate是一个开源的对象关系映射(Object Relational Mapping,简称ORM)框架,用于Java应用程序与关系型数据库交互。通过使用Hibernate,开发人员可以将...

    用 hibernate 和 spring 开发持久层.doc

    【标题】: 使用Hibernate和Spring开发持久层 【描述】: 本文主要讲解如何利用Hibernate和Spring框架构建企业级应用的持久层,帮助开发者从初学者到专家的进阶。 【标签】: Hibernate 【正文】: 在Java开发中,...

    Hibernate实体层设计

    Hibernate,作为Java领域中的一款著名持久化框架,它将对象关系映射(ORM)的概念引入到数据库操作中,极大地简化了数据库编程工作。本篇文章将深入探讨Hibernate实体层设计的核心概念、优势以及如何在实际项目中...

Global site tag (gtag.js) - Google Analytics