Hibernate相关知识

首先介绍一下持久化和持久层:

持久化:

持久化就是把内存中的数据同步保存到数据库或永久存储设备中。

持久层:

持久层就是专门负责持久化的逻辑层,由它统一与数据库底层打交道。这样一来,便可以将以前的三层模型(表示层,业务逻辑层,数据库层)修改成四层(表示层jsp,业务逻辑层Servlet/dao,持久层hibernate,数据库层database)。

表示层:接收客户端用户的表单数据,并提交给业务逻辑层进行处理。接收业务逻辑层处理后的结果,并进行布局整理后展示给客户端用户。

业务逻辑层:接收表示层提交过来的用户表单,调用相应的业务处理逻辑进行处理。通过持久层取得原始数据进行加工处理,并把有关结果送入持久层处理,将最后的结果反馈给表示层。

持久层:新增数据,修改数据,删除数据,查找数据,对象关系映射,连接池管理,事务管理,缓存管理,性能管理等。

数据库层:Oracle,Sysbase,Mysql

1.Hibernate简介

Hibernate是一种开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的封装,使得程序员可以使用面向对象的编程思想来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在JavaApplication中使用,也可以在Servlet/JSP的Web应用中使用。

Hibernate的基本映射数据类型是Java基本数据类型与标准SQL类型相互转换的桥梁。通过Hibernate的基本映射类型转换成另一种形式,完成高质量的ORM任务。

2.Hibernate主键映射

2.1主键简介

关系数据库主要依靠主键来区分不同的记录,主键分为自然主键和代理主键。

自然主键:充当主键的字段本身具有一定的含义,是构成记录的组成部分。

代理主键:充当主键的字段本身不具有业务含义,只起主键作用。

Hibernate依靠对象标识(OID)来区分不同的持久化,而对象标识符则可以通过Hibernate内置的标识生成器来产生。

2.2Hibernate

assigned:OID的业务逻辑程序负责产生,Hibernate只是负责持久化,常用语映射自然主键。

increment:OID由Hibernate依递增方式产生,该算法依赖保存于当前应用实例中的一个最大值变量,当有多个应用实例需要访问数据库时难免会出现重复的主键,应当谨慎使用。

identity:OID由底层数据库的自增主键生成机制产生,如MySQL的auto-increment类型主键与SQL Server的identity类型的主键。

在选用Hibernate内置的标识生成器时,应根据所选用的数据库产品而定。如果数据库产品为MySQL或SQL Server,则优先考虑identity生成器,如果是Oracle则可以考虑sequence生成器,如果想提高应用的可移植性,开发跨平台的应用则选用native生成器。

3.Hibernate实体映射

Hibernate实体映射的主要任务是实现数据库关系表与持久化类之间的映射。

4.Hibernate一对一的关联

 Hibernate有两种映射实体一对一关联关系的实现方法,共享主键的方式和唯一主键方式。

5.Hibernate一对多关联

 不管是多对一单向关联还是多对一双向关联,在关系数据库中的表现方式都是一样的,均通过外键参照来实现。

6.映射多对多的关联

一般的设计中,多对多关联映射需要一个中间表,Hibernate会自动生成中间表,Hibernate使用many-to-many标签来表示多对多的关联,多对多的关联映射中,在实体类中和一对多一样,也是用集合来表示的。

7.Hibernate检索策略与HQL

立即检索:

所谓立即检索就是立即装载和初始化检索方法指定的对象,即使Session关闭了,仍然可以正常访问。

在ORM映射文件的<set>标签中设置lazy属性则表示对该持久化类的关联对象启用何种检索策略。在关联级别中,一般启用延迟检索策略,因为在加载了持久化对象后大多不会立即访问其关联对象,况且当关联对象数量巨大时,将其装载入内存开销也很大,这是开发高效Hibernate应用所应该特别注意的地方。

延迟检索(懒加载):

延迟检索是Hibernate3的默认检索策略,所谓延迟检索策略就是等到访问的时候才装载和初始化指定的对象,如果在Session实例关闭之前没有初始化延迟检索出来的对象,Session实例关闭后在访问时,就会抛出异常。

为了确保延迟检索的对象在Session关闭后仍然能被正常访问,可以使用Hibernate的isInitialized(Object obj)用于判断对象是否被初始化,再用initialize对指定的对象进行初始化处理。

HQL查询方式:

传统的SQL语言采用的是结构化的查询方法,而这种方法对于查询以对象形式存在的数据却无能为力,因此,Hibernate为我们提供了一种语法类似于SQL的语言-Hibernate的查询语言,与SQL不同的是,HQL是一种面向对象的查询语言,它可以查询以对象形式存在的数据。HQL的查询目标是对象,HQL拥有面向对象语言的所有特征,包括多态,继承和组合。

HQL条件查询可根据用户指定的条件进行查询,大大提高了HQL查询的灵活性,满足各种复杂的查询情况。

HQL查询与JDBC中的SQL查询一样支持内连接,外连接及交叉连接。

对于支持子查询的数据库来说,Hibernate支持在查询中嵌套子查询。HQL中的子查询分为相关子查询和无关子查询,一般用在HQL查询的where子句中(子查询必须放置在圆括号内),相关子查询就是子查询使用外层查询中的对象别名,而无关子查询则指子查询与外层查询无关。

8.Hibernate二级分布式缓存策略

缓存cache是位于应用程序与物理数据源之间临时存放复制数据的内存区域,其目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能。

Hibernate在查询数据时,首先会到缓存中查找,如果找到就直接使用,只有在缓存中找不到时才会从物理数据源中检索。因此,当把频繁使用的数据加载到 缓存区后,就可以大大减少应用程序对物理数据源的访问,使应用程序性能提升。

缓存分类:

一级缓存:Session缓存用于临时保存Session实例中的持久化对象,它是Hibernate不可分割的基本组成部分。

二级缓存:SessionFactory的外置缓存中存放的是数据库数据的副本,其作用于一级缓存类似,用于弥补一些缓存的不足。二级缓存可使用SessionFactory实例进行操作,在默认的情况下,SessionFactory不会启用二级缓存,当需要用到时,可将二级缓存以缓存插件的形式进行配置。二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备。

二级缓存不适用的场合:

经常被修改的数据;

出现并发访问的数据,如财务数据;

与其他应用共享的数据,因为Hibernate并不能感知数据被其他应用的修改,也就是无法保证二级缓存中的数据与数据库中数据的一致性。

二级缓存适用的场合:

数据更新频率低,也就是那些很少被修改的数据;

允许偶尔出现并发问题的非重要数据;

不会被并发访问的数据;

常量数据;

不会被第三方修改的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值