Hibernate

Hibernate是一种开源的对象/关系映射框架,提供了事务处理、生命周期管理等功能,支持多种主键生成策略,如increment、identity、sequence等。它优化了数据库操作,提高了开发效率和性能。在Hibernate中,缓存分为一级缓存和二级缓存,延迟加载技术可减少不必要的数据库交互。此外,Hibernate支持悲观锁和乐观锁,以保证数据一致性。在实际应用中,应合理选择缓存策略和事务隔离级别,以优化性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


O/R Mapping定义:对象-关系映射是一门非常实用的工程技术,它实现了java应用中的对象到关系数据库中的表的自动的(和透明的)持久化,实用元数据(meta data)描述对象与数据库间的映射
O/R Mapping的优点:
- 提高生产效率
- 可维护性
- 更好性能
Hibernate特点:
1. 是一种开放源代码的对象/关系映射持久层框架
2. 事务处理,生命周期管理不依赖与J2EE容器
3. 解决数据库的方言问题
4. Hibernate只需要操作对象就可以完成数据库的增,删,改,查操作。使用hibernate更面向对象
5. 轻量级。无侵入性。移植性很好
ssh:
struts: 撑杆
hibernate:冬眠
spring:春天
hibernate应用范围
不适用范围:
- 批量对对象进行操作
- 使用数据库特定映射
- 表间关系复杂时,会造成性能问题
主键生成策略
- increment(自动增长,其主键有hibernate控制,数据库中相应的字段没有设置自动增长,不能用于集群)
- identity(自动增长,对DB2、Mysql,sql service数据库中相应的字段设置自动增长)
- sequence(对Oracle数据库中相应的字段设置自动增长)
- UUID:采用UUID算法生成字符串唯一标示,UUID生成策略嫌贵来说速度较快,不需要使用数据库相关的维护表的操作,但查找相对较慢
- native(根据数据库底层的描述,决定采用identity,sequence中的这一个)
- assigned:手动分配主键,当generator没有设置时,采用这种方式
- select:使用触发器分配主键
- foreign:使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用
###Oracle序列添加主键生成策略  
    <id name ="custid">
        <generator class="sequence">
            S_CUST_ID为序列名称
            <param name= "sequence">S_CUST_ID</param>
        </generator>
    </id>
对象状态
1. Transient(瞬时状态):当生成PO对象时产生,数据库中没有响应的记录,没有session对其进行管理
2. Persistent(持久状态):当session对象调用saveorupdate()时,数据库中有与之对应的记录,有session对象对之进行管理,当PO对象的值发生改变时,session对象让数据库记录与之同步
3. Detached(游离状态):当session事务提交时,数据从中有与之对应的记录,从session一级缓存中清除,session对其不在进管理
hibernate中get和load的区别:
1. get为立即加载,调用get方法是,会马上执行sql将结果查询出来,load为延时加载,调用load方法时,不会马上查询结果,而是当查询出来的对象在使用时,才发出sql语句查询结果。
2. 当查询的主键不存在时,get方法返会null,Load方法会抛出“对象未找到异常”。
对延迟加载而言,一但查询的对象不使用,不会真正查询数据库,这时,如果session关闭,再使用查询的对象,那么会抛出“org.hibernate.lazyInitializationException”懒加载异常
几种实体间的关系:
一对一关系:
- 主键关联:从表的主键,同时又是主表的外键,从表没有单独的外键列
- 外键关联:从表存在外键列,关联主表的主键列,但外键列是不重复的
一对多关系:
多对多关系:
    class:类=》表
    id:id主键映射
    <generator class="increment"> 主键生成器
    <one-to-one name="card">        一对一节点
    cascade="all"  级联操作(all,none,delete,save-update),当当前对象执行某操作的情况下,其关联的对象也执行,cascade设置的同样操作
###cascade和inverse的区别:
- cascade表示级联操作,当主表记录操作时,从表记录做相应的操作,维护的是记录
- inverse表示控制反转,当该属性设置为真时,表示由关联对象维护外键关系,当前对象不做外键维护,维护的是外键,一般来说,inverse设置在一方,外键由从表维护。
Hibernate性能:缓存、延迟加载、事务、悲观、乐观锁
 缓存:
- 就是数据库在内存中的临时容器,
- 位于数据库和数据库访问层的中间,
- ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如发现所需的数据,则直接将此数据作为结果加以利用,
- 避免了数据库调用型的开销,相对于内存操作而言,
- 数据库调用时一个代价高昂的过程
缓存分类:
一级缓存:即在当前事务范围内的数据缓存
- -就Hibernate来讲, (一级缓存)事务级缓存是基于    Session的生命 周期实现的,session一旦关闭,一级缓存就清除,一级缓存为hibernate自带的缓存,是必需的。
应用级(二级)缓存:即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享.
- -在Hibernate中,应用级缓存由SessionFactory实现
分布式缓存:即在多个应用实例,多个JVM间共享的缓存策略
延迟加载
在有关联的持久类对象中,对一个对象进行的查询也会向另一个对象进行查询
所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作
hibernate 3.X的lazy(延迟加载)默认值是true,需要注意
延迟加载类型:
- 实体对象的延迟加载(load())
- 集合的延迟加载(一对多和多对多,关联集合)
- 属性的延迟加载(clob大数据类型时)
clob 存放大文本的类型
blob 存放二进制数据的类型
悲观和乐观锁
保证这些数据在某个操作过程中不会被外界修改,这样的机制,也就是所谓 的“锁”
Hibernate支持两种锁机制
-  “悲观锁(Pessimistic Locking)” 
-  “乐观锁(Optimistic Locking)”。
悲观锁
实现依赖于数据库机制,在整个过程中,将数据锁定,其它任何用户不能对其读取和修改,一般适合于短事务,并发性不好
乐观锁
悲观锁保证操作独占性,性能开销巨大
**乐观锁依靠数据版本记录机制实现**
- 为数据增加一个版本标识 ,增加一个version字段
- 读取数据时,将版本号一同读出 
- 更新时,版本号加一 
- 将提交数据的版本与数据库表对应记录的当前版本信    息进行比对
- 如果提交的数据 版本号大于数据库表当前版本号,则     予以更新,否则认为是过期数据 
数据隔离级别
1. Read  UnCommited没有提交,就能读到。比如发出insert,在没有提交时就能更新数据库。
    存在脏读,一个事务读取一行,另一个事务已经将该记录更新但没有提交
    如果一个事务已经写数据,另一个事务则不允许同时进行写操作
2. Read Commited提交读。提交之后,才可以更新数据库
    不存在脏读。存在不可重复读。
    如果一个用户读出是张三。另一个用户将该用户名改为李四,那么第一个用户再读则是李四
    存在虚读,用户查询数据时,两次查询的内容不一致
    未提交的写事务将会禁止其他事务访问该行
3. Repeatable Read可重复读
    读取的事务将禁止写事务,写事务则禁止任何其他事务
     不存在不可重复读,但不能避免虚读
4. Serializable可序列化读
    事务只能一个接一个执行,不能并发执行
Hibernate连接池
1. 使用Hibernate自带的连接池(算法不成熟)
2. 使用配置文件指定的数据库连接池。 
3. 从容器中获取得到连接池(如:Tomcat) 
理解数据库连接池
每次一次请求都要建立数据库连接
每一次数据库连接,使用完后都得断开
不能控制被创建的链接对象shuffle
频繁的数据库连接操作势必占用很多的系统资源,响应速度必定下降。程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库,系统资源被毫无顾忌的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。
为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的链接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕后再放回去,通过设定连接池最大连接shuffle来防治系统无休止的数据库连接,更为重要的是可以通过连接池的管理机制监视数据库的链接的数量,使用情况。为系统开发测试,性能调整提供依据。
连接池的工作流程:
持久层向连接池申请一个连接 。连接池返会一个空闲连接。如果没有空闲连接,那么就检查连接池中的链接数量是否达到最大连接数。如果没有到达最大连接数,则建立新的链接对象放入连接池中。如果达到最大连接数,那么用户就需要等待。这时可以设置最大等待时间来控制用户的等待状态,等待时间内,有别的链接对象被释放那么久分配个等待用户,如果超时,那么返会null。
hibernate常见的优化策略:
- 用高版本的hibernate
- 指定合理的缓存策略
- 采用合理的session管理机制
- 尽量使用延时加载
- 如有可能,采用UUID作为主键生成策略
- 如有可能,选用乐观锁代替悲观锁
- 在开发中,显示hibernate执行sql语句,从而指定更好的实现策略
- 复杂查询和统计查询可以使用sql语句完成,甚至可以考虑使用存储过程完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值