Hibernate

一、执行流程

执行流程

二、介绍Hibernate(扯皮)

1.Hibernate 是一个持久化框架

(1)从狭义的角度来讲,“持久化” 仅仅指把内存中的对象永久的保存到硬盘中的数据库中。

(2)从广义的角度来讲,“持久化” 包括和数据库相关的各种操作。如:CRUD。

2.Hibernate 是一个 ORM 框架

ORM:对象关系映射。O 面向对象:类、对象、属性。R 面向关系:表、行(记录)、列(字段)。M 映射。

ORM 思想:关系数据库中的 行(记录)映射一个对象,程序员可以把对数据库的操作转化为对对象的操作。

在 Hibernate 中,存在 对象关系映射文件用来描述对象与表记录之间的映射关系。

3.Hibernate 配置文件:hibernate.cfg.xml ,配置数据库连接、Hibernate 本身的一些信息、对象关系映射。

4.Entity.hbm.xml 配置文件:对象关系映射文件。

5.Session 接口:Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心。Session 有一个一级缓存,相当于 JDBC 中的 Connection。

6.SessionFactory 接口:根据配置生成 Session 的工厂。

7.Transaction :事务,可以通过 Session 来开启事务。

三、单独整合Hibernate

(1)导包

(2)编写hibernate.cfg.xml主配置文件

hibernate.cfg.xml

这里把sessionFactory整合到Spring的配置文件中去了,所以在hibernate的配置文件中没有。

(3)编写实体及实体映射文件Entity.hbm.xml 、Entity.java


Entity.hbm.xml

四、Spring与Hibernate的整合

1.把sessionFactory配置到spring容器中

配置方案一(在实际项目中最常用)

配置方案二

2、spring整合c3p0

(1).配置db.properties


(2)、配置c3p0连接池


(3)、DaoImpl继承HibernateDaoSupport


hql:

criteria:

3、Spring整合aop事务

(1)、配置核心事务管理器

(2)xml配置

配置通知:

进行织入:

(3)注解配置 

开启注解:

对业务方法进行事务注入:


五、struts与Hibernate的整合

1、导包

struts-spring-plugin.jar

2、配置常量


3、整合方案一:由struts2创建action,由spring来维护action的依赖属性


这种方案是不推荐的

整合方案2:Spring负责创建action以及组装


六、单独的Hibernate详解

框架搭建

1、导包

导入lib下的required下的包

2、准备实体&映射文件

在实体所在包下新建映射文件(名称:类名.hbm.xml),导入dtd约束(在hibernate-mapping-3.0.dtd)

3、准备主配置文件

在src目录下,新建hibernate.cfg.xml主配置文件,导入dtd约束(在hibernate-configuration-3.0.dtd)

4、书写代码

配置详解

映射文件

hibernate-mapping

package属性:填写一个包名,后续配置中默认类所在包即为package属性填写的包

class属性

映射表与类的对应

name属性:类名

table属性:表名

id属性(映射主键)

name属性:类中主键属性名

column属性:表中主键名,默认列名为属性名

length属性:当前列的长度,默认数据库对于类型最大长度

type属性:当前列的类型,默认自动检测属性

generator属性:主键生成策略

代理主键:

increment:先查询表中主键最大值,加1作为新的主键值.

identity:依赖于数据库的主键自增

sequence:使用数据库中的序列

hilo:hibernate自己用高低位算法完成主键自增

uuid:生成随机字符串作为主键(长度应大于32位)

native(常用):自动根据数据库 三选一.(identity|sequence|hilo)

自然主键:

assigned:hibernate不生成主键.由开发人员自己设置主键值.

property属性(映射普通列)

name属性:类中主键属性名

column属性:表中主键名,默认列名为属性名

length属性:当前列的长度,默认数据库对于类型最大长度

type属性:当前列的类型,默认自动检测属性

主配置文件

整体结构在框架搭建的主配置文件中。

自动建表(hibernate.hbm2ddl.auto)

create:自动建表,每次启动hibernate都会自动建表,即使表已经存在,仍然会删除重新建。

create-drop:自动建表,每次启动hibernate都会自动建表,每次运行完成后会将表删除。

update:自动建表,如果有表,就不在重新创建,如果配置改变,自动更改表结构。

validate:不会自动创建表结构,只负责在启动时检验表结构,检出问题后会抛出异常。

API详解

configuration

SessionFactory

根据配置信息创建session对象。

1. SessionFactory创建需要消耗较多的内存资源。

2. SessionFactory是线程安全的设计。

结论:在一个web项目中确保只有一个SessionFactory存在。

Session

hibernate中操作数据库的核心对象。

1. 操作增删改查

2. 获得事务操作对象

Transaction

用于操作事务的对象

创建实体对象规则

1、public的空参构造

2、准备属性,public的set/get方法

3、提供oid,映射主键字段

4、标识属性尽量使用基本数据类型的包装类

5、类不能被final修饰

对象的三种状态

瞬时 没id,没关联(session关联)

持久 有id,有关联(session关联)

游离 有id,没关联(session关联)

持久化状态:持久化状态对象会在事务提交时会持久化到数据库,我们需要将对象持久化到数据库,就需要把对象转换为持久化状态。

一级缓存

一级缓存:也称为session缓存.属于线程级别缓存. 该缓存本质其实就是一个集合.该集合被放置到了session对象中.所以也叫session缓存.因为session是线程级别的.所以该缓存属于线程级别缓存.

缓存的作用:提高查询、修改效率。

查询:

1. 根据id查询对象

2. ResultSet会被封装成对象,放入缓存以及返回程序。如果缓存中存在要查id的对象,返回缓存中的对象。

修改:

1. 根据id查询对象

2. ResultSet会被封装成对象,一式两份,分别放入session缓存以及缓存快照中

3. 事务在提交时,会比对session缓存中的以及快照中的对象是否发生变化。如果发生变化执行修改。

hibernate中的事务管理

设置事务隔离级别

hibernate中事务的应用

1、事务在service层管理。

2、确保service层和dao层使用的时同一个Connection,调用getCurrentSession方法是从ThreadLocal中获得与线程绑定的session。

3、getCurrentSession必须配置才能使用

4、getCurrentSession方法获得的session对象,会在事务提交时自动关闭,不用手动关闭。

一对多|多对一关系

ORM

ORM:对象关系映射

o:一的一方使用集合,多的一方直接引用一的属性

r:多的一方使用外键引用一的一方

m:一对多关系映射,多对一关系映射

应用

Cascase属性:级联操作

(1)、none:默认值,不级联

(2)、save-update:级联保存或级联更新

(3)、delete:级联删除

(4)、all:save-update+delete

结论:Cascase属性的性质属于减少开发时书写代码量的配置,可以不用靠写代码代替,级联操作尤其级联删除配置使用风险大,不建议使用。

inverse属性:是否放弃维护关

inverse属性:

- true:放弃

- false(默认):维护

一对多中可以使用Inverse属性放弃维护关系,多对一中不能放弃维护关系。

结论:为了避免维护关系SQL打印冗余,可以在一的一方放弃维护。配置后注意,表达关系只能通过多的一方来维护。

多对多关系

ORM

ORM:对象关系映射

(1)、r:使用第三张表,该表至少两列,两列都是外键

(2)、o:两方都用集合来表达引用多个对方

(3)、m: 多对多映射文件



应用

Cascade属性:级联操作

与一对多|多对一关系中相同的操作

不推荐使用delete

inverse属性:是否放弃维护关系

inverse属性:

(1)、true:放弃

(2)、false(默认):维护

结论:为了避免维护关系重复造成异常抛出,根据业务需要由一方放弃维护。放弃的规则:谁不依赖,谁放弃。例如:订单和商品,商品不依赖订单的存在,商品放弃维护。

Hibernate中的查询

(1)根据OID查询

(2)对象属性导航

(3)HQL查询

(4)Criteria查询

(5)原生SQL查询

HQL

Hibernate Query Language:hibernate查询语言

该查询语言是面向对象的查询语言.

HQL语句中绝对不可能出现与数据库相关的信息.

该语言是Hibernate独有的语言.只能在Hibernate中使用

语法

一. 基础语法

二. 投影查询

查询一个属性

查询两个属性

查询多个对象,并封装到对象中

三. 条件查询

问号占位符

命名占位符

四. 分页查询

五. 排序

desc降序,asc升序

六. 聚合函数查询

Count、Max、Min、Sum、Avg

七. 多表查询

内连接

迫切内连接

左外连接

左外迫切连接

右外连接、右外迫切连接在左的基础上把left换为right即可。

结论:HQL适用于单表或简单多表,业务逻辑较为复杂的多表仍然需要使用原生SQL书写.

Criteria查询

hibernate框架中独有的查询方式.

Criteria是无语句面向对象查询.

Criteria一般用于单表查询.

语法

一、基础查询

二、条件查询

三、分页查询

四、排序查询

五、聚合查询

离线Criteria查询对象

离线Criteria:不需要session就可直接创建

结论:适合单表

原生SQL

语法

一、基本查询


将指定结果封装到对象中

二、条件查询

参数查询:可以用问号|命名占位符

三、分页查询

用于复杂业务查询

查询策略

类级别查询策略

lazy属性:是否懒加载|延迟加载

true(默认值):懒加载|延迟加载

false:立即加载


原理:懒加载时,load方法不会立即查询,会返回要查询的对象的代理对象,这个代理对象对当前操作的session进行封装,在获得对象的属性时,能够根据关联的session加载数据。

注意事项:返回对象的初始化操作一定要在session关闭之前完成,否则会抛出no-session异常。

关联级别查询策略

集合加载策略(一对多|多对多)

lazy属性:决定集合加载策略

true(默认值):懒加载|延迟加载

false:立即加载

extra:极其懒惰,在查询数量时,只查询数量,不查询内容。

fetch属性:指定集合的加载方式

select(默认值):加载集合时使用单表查询加载

join:加载集合时使用左外连接查询(使用改属性,lazy属性会失效)

subselect:使用子查询加载多个集合,如果只加载一个,效果和select相同。

属性加载策略(多对一)

lazy属性:决定属性加载策略

proxy(默认值):由对方类级别策略代我决定

false:立即加载

fetch属性:指定属性的加载方式

select(默认值):单表查询加载数据

join:使用多表查询同时加载数据(使用改属性,lazy属性会失效)

查询策略结论:查询策略中涉及的所有属性都使用默认值

两个问题

问题一:sql语句打印n+1问题

batch-size属性:一次加载几个客户的集合,默认值为1.使用该属性选择一次加载几个客户的集合来缓解n+1问题


问题二:dao返回的代理对象,service中关闭了session。在web层使用代理对象时,session已经关闭。会抛出no-session异常。

解决方案:

1. 不使用getCurrentSession,自己将session与现程绑定。

2. 使用过滤器,由过滤器中后处理代码将session关闭。

上述操作,交由spring管理。

hibernate核心总结:

http://blog.csdn.net/shuaicihai/article/details/54571057

https://www.cnblogs.com/zhangzongle/p/5819505.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容