`
- 浏览:
6680 次
- 性别:
- 来自:
深圳
-
[i][size=large][size=large]Hibernate概念总结
Hibernate是一个开放源代码的对象关系映射框架是款ORM型框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
Hibernate是由澳大利亚的
Gavin King开发hibernate的动机有两个:发现CMP太烂;赢得对老板的争执。Gavin King当时没有任何用SQL开发数据库的经验,Gavin King开发hibernate的第一件事是去街上买了本SQL基础的书。
2核心接口编辑
Hibernate体系结构的概要图
Hibernate体系结构的概要图
Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这6个核心接口分别加以介绍。
Session
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
SessionFactory
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
性能优化编辑
初用HIBERNATE的人也许都遇到过性能问题,实现同一功能,用HIBERNATE与用JDBC性能相差十几倍很正常,如果不及早调整,很可能影响整个项目的进度。 大体上,对于HIBERNATE性能调优的主要考虑点如下: Ø 数据库设计调整
.HQL优化
.API的正确使用(如根据不同的业务类型选用不同的集合及查询API)
.主配置参数(日志,查询缓存,fetch_size, batch_size等)
.映射文件优化(ID生成策略,二级缓存,延迟加载,关联优化)
.一级缓存的管理
.针对二级缓存,还有许多特有的策略
.事务控制策略。
数据库设计
a) 降低关联的复杂性
b) 尽量不使用联合主键
c) ID的生成机制,不同的数据库所提供的机制并不完全一样
d) 适当的冗余数据,不过分追求高范式
HQL优化
HQL如果抛开它同HIBERNATE本身一些缓存机制的关联,HQL的优化技巧同普通的SQL优化技巧一样,可以很容易在网上找到一些经验之谈。
主配置
a) 查询缓存,同下面讲的缓存不太一样,它是针对HQL语句的缓存,即完全一样的语句再次执行时可以利用缓存数据。但是,查询缓存在一个交易系统(数据变更频繁,查询条件相同的机率并不大)中可能会起反作用:它会白白耗费大量的系统资源但却难以派上用场。
b) fetch_size,同JDBC的相关参数作用类似,参数并不是越大越好,而应根据业务特征去设置
c) batch_size同上。
d) 生产系统中,切记要关掉SQL语句打印。
缓存
a) 数据库级缓存:这级缓存是最高效和安全的,但不同的数据库可管理的层次并不一样,比如,在Oracle中,可以在建表时指定将整个表置于缓存当中。
b) SESSION缓存:在一个HibernateSESSION有效,这级缓存的可干预性不强,大多于HIBERNATE自动管理,但它提供清除缓存的方法,这在大批量增加/更新操作是有效的。比如,同时增加十万条记录,按常规方式进行,很可能会发现OutofMemeroy的异常,这时可能需要手动清除这一级缓存:Session.evict以及 Session.clear
c) 应用缓存:在一个SESSIONFACTORY中有效,因此也是优化的重中之重,因此,各类策略也考虑的较多,在将数据放入这一级缓存之前,需要考虑一些前提条件:
i. 数据不会被第三方修改(比如,是否有另一个应用也在修改这些数据?)
ii. 数据不会太大
iii. 数据不会频繁更新(否则使用CACHE可能适得其反)
iv. 数据会被频繁查询
v. 数据不是关键数据(如涉及钱,安全等方面的问题)。
缓存有几种形式,可以在映射文件中配置:read-only(只读,适用于很少变更的静态数据/历史数据),nonstrict-read- write,read-write(比较普遍的形式,效率一般),transactional(JTA中,且支持的缓存产品较少)
d) 分布式缓存:同c)的配置一样,只是缓存产品的选用不同,在目前的HIBERNATE中可供选择的不多,oscache, jboss cache,目前的大多数项目,对它们的用于集群的使用(特别是关键交易系统)都持保守态度。在集群环境中,只利用数据库级的缓存是最安全的。
延迟加载
a) 实体延迟加载:通过使用动态代理实现
b) 集合延迟加载:通过实现自有的SET/LIST,HIBERNATE提供了这方面的支持
c) 属性延迟加载:
方法选用
a) 完成同样一件事,Hibernate提供了可供选择的一些方式,但具体使用什么方式,可能用性能/代码都会有影响。显示,一次返回十万条记录 (List/Set/Bag/Map等)进行处理,很可能导致内存不够的问题,而如果用基于游标(ScrollableResults)或 Iterator的结果集,则不存在这样的问题。
b) Session的load/get方法,前者会使用二级缓存,而后者则不使用。
c) Query和list/iterator,如果去仔细研究一下它们,你可能会发现很多有意思的情况,二者主要区别(如果使用了Spring,在HibernateTemplate中对应find,iterator方法):
i. list只能利用查询缓存(但在交易系统中查询缓存作用不大),无法利用二级缓存中的单个实体,但list查出的对象会写入二级缓存,但它一般只生成较少的执行SQL语句,很多情况就是一条(无关联)。
ii. iterator则可以利用二级缓存,对于一条查询语句,它会先从数据库中找出所有符合条件的记录的ID,再通过ID去缓存找,对于缓存中没有的记录,再构造语句从数据库中查出,因此很容易知道,如果缓存中没有任何符合条件的记录,使用iterator会产生N+1条SQL语句(N为符合条件的记录数)
iii. 通过iterator,配合缓存管理API,在海量数据查询中可以很好的解决内存问题,如:
while(it.hasNext()){
YouObject object = (YouObject)it.next();
session.evict(youObject);
sessionFactory.evice(YouObject.class, youObject.getId());
}
如果用list方法,很可能就出OutofMemory错误了。
集合的选用
在Hibernate3.1文档的“19.5. Understanding Collection performance”中有详细的说明。
事务控制
事务方面对性能有影响的主要包括:事务方式的选用,事务隔离级别以及锁的选用
a) 事务方式选用:如果不涉及多个事务管理器事务的话,不需要使用JTA,只有
JDBC的事务控制就可以。
b) 事务隔离级别:参见标准的SQL事务隔离级别
c) 锁的选用:悲观锁(一般由具体的事务管理器实现),对于长事务效率低,但安全。乐观锁(一般在应用级别实现),如在HIBERNATE中可以定义 VERSION字段,显然,如果有多个应用操作数据,且这些应用不是用同一种乐观锁机制,则乐观锁会失效。因此,针对不同的数据应有不同的策略,同前面许多情况一样,很多时候我们是在效率与安全/准确性上找一个平衡点,无论如何,优化都不是一个纯技术的问题,你应该对你的应用和业务特征有足够的了解。
批量操作
即使是使用JDBC,在进行大批数据更新时,BATCH与不使用BATCH有效率上也有很大的差别。可以通过设置batch_size来让其支持批量操作。
举个例子,要批量删除某表中的对象,如“delete Account”,打出来的语句,HIBERNATE找出了所有ACCOUNT的ID,再进行删除,这主要是为了维护二级缓存,这样效率肯定高不了,在后续的版本中增加了bulk delete/update,但这也无法解决缓存的维护问题。也就是说,由于有了二级缓存的维护问题,HIBERNATE的批量操作效率并不尽如人意。
hibernate工作原理:
1、通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件。
2、由hibernate.cfg.xml中的<mappingresource="com/xx/User.hbm.xml"/>读取解析映射信息。
3、通过config.buildSessionFactory();//得到sessionFactory。
4、sessionFactory.openSession();//得到session。
5、session.beginTransaction();//开启事务。
6、persistent operate;
7、session.getTransaction().commit();//提交事务
8、关闭session;
9、关闭sessionFactory;
hibernate优点:
1、封装了jdbc,简化了很多重复性代码。
2、简化了DAO层编码工作,使开发更对象化了。
3、移植性好,支持各种数据库,如果换个数据库只要在配置文件中变换配置就可以了,不用改变hibernate代码。
4、支持透明持久化,因为hibernate操作的是纯粹的(pojo)java类,没有实现任何接口,没有侵入性。所以说它是一个轻量级框架。
hibernate延迟加载:
get不支持延迟加载,load支持延迟加载。
1、hibernate2对 实体对象和集合 实现了延迟加载
2、hibernate3对 提供了属性的延迟加载功能
hibernate延迟加载就是当使用session.load(User.class,1)或者session.createQuery()查询对象或者属性的时候
这个对象或者属性并没有在内存中,只有当程序操作数据的时候,才会存在内存中,这样就实现延迟加载,节省了内存的开销,从而提高了服务器的性能。
Hibernate的缓存机制
一级缓存:session级的缓存也叫事务级的缓存,只缓存实体,生命周期和session一致。不能对其进行管理。
不用显示的调用。
二级缓存:sessionFactory缓存,也叫进程级的缓存,使用第3方插件实现的,也值缓存实体,生命周期和sessionFactory一致,可以进行管理。
首先配置第3放插件,我们用的是EHCache,在hibernate.cfg.xml文件中加入
<propertyname="hibernate.cache.user_second_level_cache">true</property>
在映射中也要显示的调用,<cacheusage="read-only"/>
二级缓存之查询缓存:对普通属性进行缓存。如果关联的表发生了修改,那么查询缓存的生命周期也结束了。
在程序中必须手动启用查询缓存:query.setCacheable(true);
优化Hibernate
1、使用一对多的双向关联,尽量从多的一端维护。
2、不要使用一对一,尽量使用多对一。
3、配置对象缓存,不要使用集合缓存。
4、表字段要少,表关联不要怕多,有二级缓存撑腰。
hibernate 类与类之间关系
关联关系
聚集关系
继承关系
Hibernate继承关系映射策略分为三种:一张表对应一整棵类继承树、一个类对应一张表、每一个具体类对应一张表。
词条图册更多图册
◆
Hibernate有关书籍(10张)
1/1
Java(甲骨文公司)
Java平台
▪ Java 编程语言 ▪ JVM ▪ Java ME ▪ Java SE
▪ Java EE ▪ Java Card
升阳电脑主要技术
▪ Squawk ▪ JDK ▪ OpenJDK ▪ Java Virtual Machine
▪ JavaFX
平台技术
▪ Applet ▪ Servlets ▪ MIDlets ▪ JSP
▪ Web Start (jnlp)
主要的第三方技术
▪ JRockit ▪ GNU Classpath ▪ Kaffe ▪ TopLink
▪ Apache Harmony ▪ Struts ▪ Spring Framework ▪ Hibernate
▪ JBoss ▪ Tapestry ▪ Jazelle
历史
▪ 历史 ▪ 批评 ▪ Java Community Process ▪ 升阳电脑
▪ Free Java implementations
主要编程语言
▪ Tcl/Java ▪ Jython ▪ JRuby ▪ BeanShell
▪ Clojure ▪ Groovy ▪ Rhino ▪ Scala
▪ Processing
Java会议
▪ JavaOne
参考资料
1. Hibernate数据批量处理解决方案 .中国Linux联盟 [引用日期2012-11-26] .
2. Hibernate中所有包作用详细讲解 .李岩的博客 [引用日期2013-03-21] .
相关文献
基于Spring MVC和Hibernate集成的Portlet开发构架研究-软件导刊-2011年 第1期 (10)
基于Struts+Hibernate的软考成绩查询与分析系统-湖北广播电视大学学报-2011年 第2期 (31)
基于JavaEE的AOM.Spring-Hibernate架构及应用-计算机系统应用-2011年 第2期 (20)[/size][/i][/size]
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
通过以上对Hibernate视频教程的知识点详细介绍,可以帮助读者更全面地理解Hibernate框架的核心概念和技术细节,并掌握如何在实际项目中应用这些技术。希望本篇总结能够为学习Hibernate的朋友提供有价值的参考。
《深入浅出Hibernate》这本书是Hibernate技术学习的重要参考资料,它为读者提供了全面、深入的Hibernate框架理解。Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互,使得...
标题中的“在eclipse中加入XDoclet templates方便书写hibernate元数据”是指使用XDoclet工具在Eclipse集成开发环境中(IDE)为Hibernate项目自动生成元数据的一种方法。XDoclet是一款强大的Java注解处理器,它可以...
这个教程将深入介绍Hibernate的核心概念和技术,帮助开发者更好地理解和使用Hibernate进行数据库操作。 ### 一、Hibernate概述 Hibernate 是Java领域中最受欢迎的ORM框架之一,它允许开发人员用面向对象的方式处理...
2. **Hibernate查询语言 (HQL)**:Hibernate提供了强大的查询语言HQL,它允许用户书写SQL语句的同时利用面向对象的语法。HQL的语法设计使得开发者能够轻松上手。 3. **自动管理Session**:在Hibernate中,`Session...
4. **查询语言HQL**:Hibernate Query Language允许开发者用面向对象的方式书写查询,增强了代码的可读性。 5. **缓存机制**:Hibernate内置了二级缓存,可以提高数据访问效率,减少数据库压力。 在网络购物系统中...
《Hibernate 4.1.5.SP1:持久化框架的核心技术与应用》 Hibernate,作为Java领域中的一个著名对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者能够以面向对象的方式处理数据库交互。本次我们将深入...
本压缩包文件"基于Java 通用数据访问组件,基于mybatis、spring jdbc、hibernate.zip"包含了一些关于如何使用Java中的三种主流数据访问技术——MyBatis、Spring JDBC和Hibernate的资源,这些技术都是Java开发者必备...
综上所述,Java技术在XML和数据库通信中的应用主要集中在Servlet的使用以及ORM框架如Hibernate的集成,它们大大简化了数据交换和数据库操作,增强了系统的灵活性和可扩展性。对于开发人员来说,掌握这些技术对于构建...
但是,我不想让我的学生认为使用工具的操作步骤就是Hibernate的开发,所以书写一个例子来说明,其它MyEclipse中的Hibernate插件功能不是Hibernate的固有功能,它是IDE提供的功能。同时也想说明,不要认为只有VS才...
- **静态导入**:简化代码书写,减少冗余。 - **核心编程**: - **I/O操作**:处理文件读写、网络通信等。 - **多线程**:实现并发处理提高程序效率。 - **实体类**:封装数据和逻辑。 - **集合类**:提供高效...
于是,使用Facade模式和反射技术模拟Hibernate框架技术演示怎样书封装数据库的操作。 环境:Windows XP Professional, JDK 1.6, Eclipse 3.3 Europa, SQL Server 2000 使用步骤: 1. 下载解压之后,使用Eclipse导入...
3. **EL(Expression Language)**:简化了页面表达式的书写,用于访问页面作用域内的Java对象。 4. **JSTL(JavaServer Pages Standard Tag Library)**:一套标准的标签库,提供常用的控制结构和数据处理功能,如...
它需要程序员自己去写 SQL 语句,不象 Hibernate 那样是完全面向对象的,自动化的,iBATIS 是半自动化的,通过表和对象的映射以与手工书写的 SQL 语句,能够实现比 Hibernate 等更高的查询效率。 iBATIS 只是封装了...
SSH整合是Java开发中一种常见的技术栈组合,主要包括Spring、Struts和Hibernate这三个框架的集成。这个"ssh整合案例代码"应该提供了一个完整的示例,帮助开发者了解如何在实际项目中将这三个框架协同工作。接下来,...
- 简化JSP中的表达式书写。 - **JSTL (JSP Standard Tag Library)**: - 一组预定义的标签,用于简化JSP页面的开发。 - **会话管理 (Session, Cookie)**: - 用于跟踪用户的会话状态。 #### 框架与模式 1. **...
- **定义**:用于简化JSP页面中的数据访问和表达式书写。 - **优势**:减少硬编码、提高可读性和可维护性。 ##### 6. JSTL (JSP Standard Tag Library) - **定义**:一套标准的JSP标签库,提供常用的标签功能。 - *...
- **数据访问层**:使用JDBC、Hibernate或MyBatis等框架与数据库交互,进行数据存取。 **项目组织**: 遵循良好的代码组织原则,将不同层次的组件放在相应的包下,例如,模型类放在model包下,控制器类放在...
#和$书写占位符的区别在于#会被预编译到SQL中,而$则会直接替换到SQL语句中。 10. Spring框架是目前Java企业级开发中最流行的技术之一,它支持了依赖注入(DI)、面向切面编程(AOP)、事务管理等核心功能。Spring...
总的来说,“fresh.zip”项目提供了一个基于IntelliJ IDEA的生鲜管理系统简化版本,它利用JavaWeb技术栈实现了数据管理、业务逻辑处理和用户交互。通过对各个文件和目录的理解,我们可以深入学习JavaWeb开发,掌握...