Hibernate理解

来源:互联网 发布:电脑抗蓝光软件 编辑:程序博客网 时间:2024/05/16 11:37

Hibernate

什么是Hibernate

 Hibernate是一个开放源代码的orm(Object  Relation mapping  对象关系映射框架,主要是对jdbc进行了轻量级的封装;

HibernateIbatis的区别以及优缺点

Hibernateibatis的区别:

1、ibatassql语句需要自己手动写,而hibernate能够在程序运行时自动生成hibernate还能自动创表;

2、iBATIS需要手写sql语句,也可以生成一部分,Hibernate则基本上可以自动生成,偶尔会写一些Hql。同样的需求,iBATIS的工作量比 Hibernate要大很多;例如修改了某个表了面的数据,hibernate只要修改映射文件和javaBean;而ibatis要一一去修改;

Hibernate

Hibernate的优点:

1、SQL语句都被封装,开发效率高;

2、性能比较好,可以很好的映射各种关系型数据库,可移植性高;

Hibernate的缺点:

1、不是很灵活,不容易被控制;

2、对持久层数据封装过于完整,无法对SQL进行优化

3、如果数据库的表过多,关系也很复杂,hibernate就会变得很难维护;

 Ibatis:

Ibatis的优点:

1、使用较灵活,更好被控制;

2、易于学习,易于使用,通过文档和源代码,便可知晓它的设计思路和实现;

Ibatis的缺点:

1、sql需要自己写

2、对象关系映射,工具支持较少

Hibernate的核心接口和作用

六大顶级接口:Session、SessionFactory、Transaction、Query、Criteria、Configuration
六大接口的作用

Session

主要是对持久化对象的操作和对数据库的访问,以及常见的SQL语句,需要注意的是session它的线程不是安全的;

SessionFactory

主要是对session进行实例化,可以创建session对象,

Transaction

主要是对事物的控制,这个接口是可选的,可以自己写事物

QueryCriteria: 

主要是对数据库的各种查询访问,可以使用HQLSQL这俩中语言;

Configuration:

Configuration接口负责配置并启动Hibernate,创建SessionFactory对象;并且定位映射文档位置、读取配置,然后实例化SessionFactory

Hibernate三种状态

三种状态的简介:

Hibernate的对象有3种状态,分别为:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VOValue Object)。 

三种状态的区分:

持久态[持久化对象 po]

处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识;可以通过session中的delete来让它成为一个瞬时态

托管态[值对象 vo]

当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。

 

瞬时态[值对象 vo]:

不和数据库的数据有任何关联关系,但是可以通过session中的save或者saveOrUpdate方法将瞬时态转为持久态

 

Java术语

Po(persistant object) 持久化对象

Po中应该不包含任何对数据库的操作

PoJo(plain ordinary java object) 简单无规则java对象

最基础的java bean类,里面只有属性字段以及getset方法

Vo(value object) 值对象

业务层之间的数据传递,PO一样也是仅仅包含数据而已

 

Bo(business object) 业务对象

通过调用数据访问对象的方法,结合持久化对象和值对象对数据库进行处理

 

Dao(data access object) 数据访问对象

DAO中包含了各种数据库的操作方法通常和持久化对象结合使用,通过它的方法,结合持久化对象对数据库进行相关的操作

dto(Data Transfer Object)数据传输对象

主要用于远程调用等需要大量传输对象的地方。

 

Loadget方法的区别相同点:

Getload都是通过id来查询,并且查询出来是持久状态;

不同点:

如果找不到符合条件的记录,get方法返回null,load方法抛出异常;

当数据不变时,get会查询一级缓存、二级缓存,若是在缓存中不存在,则会去查询数据库;

load是查询一级缓存后,若是在一级缓存中没有找到对应数据,则会创建一个代理对象,然后根据这个代理对象id去查找二级缓存和数据库;

List iterator的区别

相同点:

他们查询出来都是结果集;

不同点:

返回的类型不一样,list()返回List, iterate()返回Iterator,
 list对缓存只写不读,然而iterator却充分的利用到了写进去的缓存;

若是缓存区中没有记录,使用iterator访问数据库会出现N+1条查询语句,而list始终都是一条;

如果SQL语句不变同时数据也没被改变的情况下,list直接取的缓存而不用再连接数据库进行检索

iterator方法用n+1此来获得所有数据信息同时放到缓存中,不管SQL语句变没变始终会发送一

条获得IDSQL语句,然后根据ID查找缓存,如果没有则再发送一条SQL语句获得该对象;

 

三大常用查询方式

HQL

什么是HQL

Hql (Hibernate query language) hibernate提供了灵活的查询方式,和sql很相似,hql采用面向对象的查询方式

Hql查询

HQLhibernate自己的一套查询语言,于SQL语法不同,具有跨数据库的优点;

对象化查询Criteria方法:

面向对象操作,易读;

sql查询

用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名

关联关系

关联关系本质

关联关系是指对象模型在内存中的一个或者多个引用

一对多关联

<many-to-one>会在多的一端加入一个外键,指向一的一端。

使用:这个外键由<many-to-one>标签中的column属性定义,如果不写此属性,默认外键与实体的属性一致

一对一关联

是多对一关联映射的特例,也可以说是一个特殊的多对一;

使用:采用<many-to-one>标签,指定多的一端unique=true(对配置的唯一性约束字段进行唯一性检查),这样可以限制 多的一端的多重性为一。

多对多关联

它的映射需要借助于第三方表,也可以说是他们之间的中间表;

使用:<key>column属性值要与单向关联中的<many-to-many>标签中的column属性值一致
<many-to-many>中的column属性值要与单向关联中<key>标签的column属性值一致

缓存

内置缓存

Session的缓存是内置的,不能被卸载,也被称为Hibernate的一级缓存,内部是封装的一个map

外置缓存

SessionFactory的外置缓存,借助于第三方插件(例如:jbossCacheEHCache)来进行工作;默认情况下是不启用的;

缓存级别

一级缓存:session

一级缓存是由Session提供的,所以它只存在于Session的生命周期中,一级缓存是由Session提供的,所以它只存在于Session的生命周期中,如果session 存中还不存在相应的对象,Hibernate会把该对象加入到一级缓存中,当Session关闭的时候该Session所管理的一级缓存也会立即被清除;

二级缓存:sessionFactory

二级缓存是全局缓存;缓存可以简单的看成一个Map,通过key在缓存里面找value

缓存范围

事务范围:

事务范围的缓存只能被当前的事务访问,而且每个时候都有各自的缓存空间,缓存内的数据通车采用相互关联的对象形式存在,事务范围的缓存生命周期是依赖于事务的生命周期,只有当事务结束时,缓存才会消失;

应用范围:

应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束

集群范围:

 在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点

事务的隔离级别

Hibernate使用隔离级别:

Hibernate的配置文件中可以显示的配置数据库事务隔离级别。每一个隔离级别用一个整数表示:

8 - Serializable 串行化
4 - Repeatable Read 可重复读
2 - Read Commited 可读已提交
1 - Read Uncommited 可读未提交

 

Serializable 串行化

使用串行化隔离级别后,必须等前一个事务结束后,这一个事务才能开始;

Repeatable Read 可重复读

当使用可重复读隔离级别时,在事务执行期间会锁定该事务以任何方式引用的所有行

 

Read Commited 可读已提交

 它只读取已提交的数据,换句话说就是,任何未提交的数据它都会置之不理,直到数据提交为止;

Read Uncommited 可读未提交

一个事务读到另一个事务还没有提交的数据。

查询缓存

锁的作用

保证些数据在某个操作过程中不会被外界修改

乐观锁:

乐观锁的原理:

读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一

乐观锁的作用:

大多是基于数据版本(Version)记录机制实现

悲观锁:

悲观锁的原理:

基于数据库的锁机制实现,适合于当前数据库的悲观锁不一定适合其他数据库,每一个数据库都有它自己的悲观锁;

悲观锁的作用:

它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态

,当某些数据被悲观锁锁定后,这些数据做删除、修改不能进行;

怎样避免n+1问题

1、使用二级缓存可以避免n+1

2、使用fetch="join",让它一次性加载数据,这样懒加载就失去了意义,也就不会出现n+1问题;

3、修改lazy 属性,lazy默认是true(true为懒加载);将它的属性改为:lazy="false",这样就不会出现n+1问题;biwpn

原创粉丝点击