- 浏览: 7326269 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
对象操作
实体状态
自由状态……实体对象在内存中自由存在,与数据库中的记录没有任何关联,处理自由状态的实例可以通过Session的save方法转换成持久状态。
持久状态……实体对象处于由Hibernate框架所管理的状态,持久状态的对象其变更将由Hibernate固化到数据库中,持久对象对应数据库中的一条记录。
游离状态……处于持久状态的实例,其关联的会话已经关闭,则此实例处于 游离状态。 游离状态的实例可以通过Session的 update方法再次和一个会话关联。
游离状态和自由状态实例的区别是自由状态的实例与数据库缺乏对应关系,而游离状态的实例包含对应数据库记录的主键值。
实体身份识别
从数据库的角度,包括Hibernate本身对于拥有同样主键值的实体对象则认为他们是相同的。在持久层之外,对象是否等价在业务逻辑层可能有另外的含 义,往往有一些特定的数据实体判定规则,这可以通过重写equals和hashCode方法实现。
脏数据检查
脏数据检查策略一般有两种方式:
数据对象监控:可以借助动态代理或CGLIB拦截设值方法,一旦设值方法被调用,则将其标记为脏状态。
数据版本比对:持久层框架维持数据对象的最新版本,当数据提交时将提交数据和此版本进行比对,如果发生变化则将其同步到数据库相应的库表。
Hibernate采用数据版本比对方式,Hibernate会话保存所有与当前会话关联实体的当前实例和原始状态信息,可以参见SessionImpl 的内部类EntityEntry。
Load/Get
这两个操作的功能都是从数据库中加载一个实例,两者的区别是前者如果没有找到匹配数据将抛出异常,后者将返回null。
List/Iterate
这两个操作的功能都是从数据库中加载多个实例,两者的区别是Iterate方法会先从会话中或者二级缓存中获取,而list方法会直接查询数据库,如果需要的数据在缓存中存在,iterate可以提供更好的性能,相反的情况下iterate方法会更慢,它会首先执行查询仅从数据库中获取标识符,然后再分别查询初始化实例。
Update/Merge
这两个操作都支持分离实例的重新关联。如果会话中已经包含同样标识符的实例,update方法会抛出异常,merge方法会合并更改再重新关联。
Flush
Flush方法的主要功能是同步内存对象和数据库,flush操作缺省发生在一些查询操作之前,事务提交时或者调用flush方法时。
显式调用flush方法并不能保证立即执行数据库同步,Hibernate保证Query.list方法不会返回过时或错误数据。
可以通过Session.setFlushMode改变缺省行 为,不至于太频繁。FlushMode定义了三种不同的刷新方式:提交时刷新,自动刷新,不刷新(除非显式调用flush方法)。
提交时刷新可能会导致查询操作获取过时数据。
级联
Hibernate 会话的基本操作,包括persist,merge,saveOrUpdate等都有相应的级联样式设置,如果你希望关联集合针对某个操作进行级联设置,可 以在映射文件中设置
缺省的级联设置是none,表示任何操作都不支持级联。
级联通常用在在一对一和一对多关系中。
继承映射
单表映射
概述: 使用一张表映射整个继承树,需要一个类别字段区分一个数据行具体对应哪个类。
优点:有很好的查询性能,不需要进行表连接。
缺点:有数据冗余。子类的字段无法建立非空约束。
类表映射
概述:每个类对应一张表。子类表只包含扩展属性,子类表和父类表通过外键关联。
优点:领域模型和数据库之间的关系非常明了。
缺点: 查询时需要多表之间的内连接或左外连接操作。字段在层次中任何上下移动的重构都会导致数据库更改。
具体表映射(UNION)
概述:每个具体类对应一张表,包含所有的字段。使用union-class进行定义。
优点:与具体表映射(隐式多态)相比,支持多态查询。
缺点:具体类不支持标识生成器,标识生成器在所有的具体类中共享。如果某个属性在超类中进行映射,则其列名在所有的子类表中必须相同。
具体表映射(隐式多态)
概述:每个具体类对应一张表,包含所有的字段。
优点:查询子类时不需要关联。
缺点:如果父类字段发生变动,所有的子类表必须同时进行修改。超类上的一次查找需要检查所有表,这会导致多次数据库访问或特殊连接操作。不支持多态外连接 抓取数据。不支持多态一对一和一对多关联。
集合映射
Hibernate要求实体的集合字段必须声明为接口类型,当持久化实体时,Hibernate会使用自己的集合实现。因此假定使用HashSet初始化 实体的集合字段,经过持久化后得到的集合字段并不是HashSet的实例,如果进行转型将发生错误。
有序/无序
Hibernate支持Set,Bag,Map三种无序集合,List是有序集合,这里所谓的有序无序是指Hibernate持久化过程中,是否保持数据集合中的记录排列顺序。
可配置属性
Lazy……缺省为true,表示不加载关联的集合。
Cascade……缺省为none,表示不级联操作集合。
Fetch……缺省为select,可以设置为join使用连接检索模式。
optimistic-lock……缺省为true,表示集合状态的改变会导致拥有集合的实体的版本增加,如果是一对多关联,通常设置为false。
Inverse
缺省为false,如果为true,表示关联由另一端管理。
Sort/Order-by
Sort/Order-by属性用来设置集合排序,前者表示排序基于内存操作的,后者表示数据库检索时进行排序,通过指定SQL语句的order by部分来实现。
外键信息
使用key元素进行定义。
元素类型
使用element和composite-element定义值类型,使用one-to-many和many-to-many定义实体类型。
索引集合
除SET和BAG外,其他集合都需要指定集合表中的索引列,LIST和ARRAY使用list-index元素定义,MAP集合使用map-key/composite-map-key或map-key-many-to-many定义。
List/Bag
如果希望使用list声明集合字段,而表中又没有索引列,那么可以使用bag元素定义映射,bag元素不具备list的有序特性。
Bag/idBag
Bag 类型是Hibernate自定义集合类型,实现一个允许包含重复元素的Set,因为Bag集合为无序集,且允许出现重复元素,这出现一个问题,当删除某个元素时如何定位待删除记录?目前的实现方式是先将表中原有的集合数据全部删除,再将现有数据逐条插入,显然这种方式的性能是极其低下的。
idBag对此进行了扩展,提供一个collection-id元素用来配置id字段,根据此id,Hibernate可以准确定位库表记录,从而实现高效的数据操作。
事务/并发
Hibernate直接使用JDBC和JTA资源的事务语义,没有添加额外的锁机制。SessionFactory是线程安全的,可以被所有的应用线程共享。Session是线程不安全的,通常用于单个请求,单个会话或单个工作单元。
通常不管读写数据,数据库交互都应该发生在事务语义中。
在多用户的C/S应用程序中,最通用的模式是基于请求的会话,使用单个的数据库事务服务整个客户请求,在WEB企业应用程序中,数据库事务跨越用户交互是无法接受的。
会话会缓存每个处理持久状态的实例,这意味着如果保持会话打开一段比较长的时间,可能导致内存不足,也可能导致过时数据。一个解决方法是调用clear和evict方法管理会话,但是更应该考虑使用存储过程处理大数据量操作。
乐观并发访问
支持高并发性和高扩展性的唯一方式是使用版本的乐观并发控制。版本检查使用版本号或时间戳来检查更新。Hibernate提供三种方式使用乐观并发控制。
手动版本检查:每次数据库操作发生在一个新的会话中,开发者有责任在操作之前加载所有的持久化实例,手动执行版本检查。这种方式是最低效的,类似于实体EJB的方式。
扩展会话方式的自动版本检查:Hibernate基于一次交互创建一个会话,在每次执行刷新时检查实例的版本,如果检测到并发更改将抛出异常,由开发人员负责捕获和处理异常。这种方式是最有效的,应用不必关心版本检查,不必重新关联分离状态的实例,也不必在每次数据库事务前重新加载所有的实例。
分离状态实例的自动版本检查:应用可以操纵一个分离状态的实例的属性,这个实例是在另一个会话加载的,然后再和一个新的会话重新关联(通过调用update或saveOrUpdate方法),当新会话刷新时会自动执行版本检查。
自定义版本检查:也可以通过设置属性或集合的optimistic-lock值为false禁止自动版本检测,也可以设置Class映射的 optimistic-lock属性为all,通过比较实例的所有字段进行版本检查,有时候并发更改只要没有发生叠加也是允许的,这可以通过设置 optimistic-lock属性为dirty实现。
悲观锁
通常情况下用户不需要共太多时间关心锁策略,通过对JDBC连接指定隔离级别可以让数据库负责这些工作,然而高级用户可能需要获取排他锁或启动新事务时重新获取锁。
Hibernate总是使用数据库的锁机制,LockMode类定义了Hibernate可以获得的锁级别,这可以通过Session的lock/load方法和Query的setLockMode方法进行操纵。
发表评论
-
【转】在项目中使用多个数据源-多sessionFactory方案
2013-05-10 16:30 3117适用范围:适合SSH架构访问多个数据库, ... -
Hibernate使用中从数据库到模型的加载方式研究
2010-01-28 13:19 1959在项目中数据库中账单Bill一个字段是有多个订单id的以逗 ... -
hibernate中@Transient的使用
2010-01-19 15:20 10687项目中可能有许多实体的需要辅助的属性和方法辅助,hibe ... -
关于hibernate中注解和hbm共存时的加载规律
2010-01-19 15:13 3795项目中使用Spring2.5+hibern ... -
hibernate查询的使用的点滴积累
2010-01-09 13:04 1910/** * 前台查询酒店的级别,设备,类型 * * ... -
Hibernate 的HQL中一个经典函数elements的使用
2010-01-09 12:53 10338在传递索引和元素给集合时(elements and indic ... -
Hibernate关联查询中with的经典使用
2010-01-09 12:42 2208在项目采用Hibernate关联,采用关联使用比较简单,在关 ... -
判断数据库表每条记录中时间段是否在每一个时间段中
2010-01-09 12:35 3077项目中一个成品价格表,每条记录中的价格有一个使用时间 ... -
JPA 中注解一个父类中多个子类实现查询部分子类方法解决方法
2010-01-09 12:10 2067父类: @Entity@Inheritance(stra ... -
Hibernate调用执行存储过程
2010-01-09 12:03 2029项目中需要采用存 ... -
Hibernate的一个异常的解决方案
2009-12-05 11:01 2439在项目中使用HQL时的遇有多个类的嵌套比较发生的异常: ... -
Hibernate的事件和拦截器体系
2009-12-01 13:53 2356持久层框架底层的拦截器机制是对诸如Spring等业务管理容器拦 ... -
Hibernate的拦截器和监听器
2009-12-01 13:52 1971最近项目需要,用到了Hibernate的拦截器和监听器,有些小 ... -
Hibernate的拦截器和监听器
2009-12-01 13:50 3796项目采用Spring构建,持久层技术采用的是 JPA规范 + ... -
Hibernate的注解many-to-one
2009-11-28 12:12 23272項目中一個實例: ... -
Hibernate查询语言HQL 八大要点
2009-11-18 13:15 2009本文讲述Hibernate查询语言HQL。Hibernat ... -
条件查询(Criteria Queries
2009-11-18 13:14 1769... -
Hibernate查询语言(Query Language), 即HQL
2009-11-18 13:05 2468Hibernate查询语言(Query L ... -
Hibernate中的配置属性
2009-11-15 17:40 1755hbm2ddl.auto的使用配置说明: <!-- ... -
Hibernate JPA 的索引的使用
2009-11-15 17:30 11880在Hibernate中Model中一个对象关 ...
相关推荐
### Hibernate核心知识点详解 #### 一、什么是Hibernate? Hibernate是一个开放源码的**对象关系映射(ORM)框架**,它允许将Java对象映射到关系型数据库中的表,以及从数据库表映射到Java对象上。通过ORM,...
### Hibernate配置要点详谈 #### 一、配置文件与配置方式 在Hibernate中,有两种主要的配置文件形式:`hibernate.cfg.xml` 和 `hibernate.properties`。 1. **`hibernate.cfg.xml`**: - 这种配置文件通常包含...
### Struts2、Spring与Hibernate整合的关键点及注意事项 #### 一、概述 在Java Web开发领域,Struts2、Spring以及Hibernate是三个非常重要的框架。它们分别在MVC架构、依赖注入与业务逻辑管理、对象关系映射等方面...
下面我们将详细讲解整合Spring、Hibernate与JPA的要点。 1. **依赖包** 在整合Spring和Hibernate的JPA之前,首先需要确保引入了正确的依赖包。这包括Spring的核心库、Hibernate的Core库以及JPA相关的库。如`spring...
在深入探讨Hibernate中的一对一(One-to-One)主键双线关联机制之前,我们首先需要理解几个核心概念:Hibernate框架、实体关系映射以及主键关联的基本原理。Hibernate是Java平台下的一款开源对象关系映射(ORM)框架...
【标题】:“hibernate和spring技术难点及其要点总结” 【描述】:“hibernate和spring技术难点及其要点总结” 本文将深入探讨Hibernate和Spring框架在Java开发中的关键概念、应用场景以及技术难点。首先,我们来...
**Struts + Hibernate Web小项目详解** 在Java Web开发领域,Struts和Hibernate是两个非常重要的框架,它们分别处理表现层(Presentation Layer)和持久层(Persistence Layer)的任务。本项目是一个基于Struts和...
### Java之Hibernate和Spring技术难点及其要点总结 #### Hibernate与Spring技术概述 在Java开发领域,Hibernate和Spring作为两个非常重要的框架,对于提高应用程序的开发效率、降低维护成本具有不可替代的作用。...
这个"struts_spring_hibernate小项目_会员管理"就是一个实际运用这三大框架的实例,适合初学者学习和理解它们的集成与应用。 1. **Struts框架**:Struts是MVC(Model-View-Controller)架构的实现,主要负责控制...
《Hibernate 5.0.12 全量包解析与技术要点详解》 Hibernate,作为Java领域中的一个著名持久化框架,一直以来都是开发者们进行对象关系映射(ORM)的重要工具。本文将针对"hibernate-release-5.0.12.zip"这一版本的...
#### 三、技术要点解析 ##### 1. Hibernate Search 的版本 文中提到的 Hibernate Search 版本为 3.0.0.GA。GA (General Availability) 表示该版本已经稳定可用,适合生产环境部署。这个版本支持 Hibernate ORM 3.x...
### Hibernate Recipes:问题与解决方案概览 ...通过本书提供的丰富示例和深入讲解,读者可以快速掌握Hibernate的核心概念和技术要点,提升自己的开发技能。无论是初学者还是有一定经验的开发者,都能从中受益匪浅。
### 复习要点 1. 理解Hibernate的实体生命周期,掌握CRUD操作。 2. 掌握HQL和Criteria查询,理解其与原生SQL的区别。 3. 学会编写和配置Spring的XML或Java配置,理解DI和AOP原理。 4. 熟悉Spring MVC的Controller、...
hibernate 映射文件 配置分析及要点,你还在为配置hibernate 映射文件而发愁吗?这里总结了它的常用元素及属性。session,SessionFactory的应用
以上是对Hibernate优化的一些核心要点,实践中还需要结合具体项目进行细致调整。理解Hibernate的工作机制,结合源码分析,可以更有效地找到性能瓶颈并进行优化。同时,利用工具如Profiler进行性能检测,可以帮助我们...
### Hibernate程序性能优化的考虑要点 在开发基于Hibernate框架的应用时,性能优化是至关重要的环节。Hibernate作为一款优秀的对象关系映射(ORM)工具,它能够简化Java应用程序与数据库之间的交互,但不当的配置和...
**三、源码学习要点** 1. **EntityScanner**: Hibernate源码中负责扫描项目中所有标注了@Entity的类,构建实体类的元数据。 2. **SessionFactoryBuilder**: 创建SessionFactory的过程,包括配置读取、数据库连接...
根据给定的文件信息“hibernate中文参考文档.pdf”,我们可以深入探讨Hibernate这一主题,它在Java开发领域中扮演着至关重要的角色。...掌握其核心概念和技术要点,对于Java开发者而言是不可或缺的技能。
这份文档旨在为学习者提供全面、详细的Hibernate框架的学习资料,帮助他们更好地理解和掌握Hibernate的相关概念和技术要点。下面将围绕这份文档可能涵盖的核心知识点进行详细阐述。 ### Hibernate概述 Hibernate是...
Struts和Hibernate是Java开发中常用的两个开源框架,它们在构建Web应用程序时起着至关重要的作用。...通过研究这个项目,开发者不仅可以提升对Struts和Hibernate的理解,还能掌握在线音乐服务的开发流程和技术要点。