Hibernate知识点
2021-04-15 17:13:45 0 举报
AI智能生成
Hibernate
作者其他创作
大纲/内容
简介
Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象!
我们使用Hibernate框架就不用我们写很多繁琐的SQL语句,从而简化我们的开发!
映射配置
集合映射
在映文件中使用list、set、map节点来实现
一对一和一对多映射
通过oneToMany和ManyToOne来实现一对多和多对一的映射
ManyToOne可以看成是在当前表中创建一个外键
保存数据最好的通过多的一方来维护关系,这样可以减少update语句的生成,从而提高hibernate的执行效率!
多对多映射
通过manyToMany来实现
一对一映射
可以通过外键的方式来实现一对一映射
没有外键的表就使用OneToOne
有外键的表就使用ManyToOne
通过主键来实现一对一映射
需要做主键又需要做外键的表:使用<generator class="foreign">的形式来表示
没有外键的表使用OneToOne
组合映射
组合映射其实就是以组合的方式来实现类与类之间的关系
使用component来实现就好了
继承映射
简单继承
优点:在属性上,直接写父类的属性就可以
缺点:如果子类过多,那么就会有很多配置文件
我们可以将所有的子类都映射成一张表中
优点:子类一张表就搞掂了
缺点:不符合数据库设计范式
每个类映射一张表
使用<joined-subclass >来实现,一个配置文件就够了
但是每个类都映射成一张表-->表结构太过于繁琐..添加信息时,过多的SQL
每个子类映射一张表, 父类不对应表(推荐)
使用<union-subclass>来实现,也是一个配置文件就够了
父类不对应表要使用abstract来修饰
inverse和cascade属性
Inverse属性:表示控制权是否转移(只能在“一”的一方中使用该属性!)
true:控制权已转移【当前一方没有控制权】
false:控制权没有转移【当前一方有控制权】
如果没有控制权:
保存:数据会保存,但是关联关系没有维护,也就是外键列为NULL
删除关联关系:不能解除关联关系,不会生成update语句,也不会报错
删除数据:如果删除的记录有被外键引用,会报错,违反主外键引用约束,如果删除的记录没有被引用,可以直接删除
cascade表示级联
none 不级联操作, 默认值save-update 级联保存或更新delete 级联删除save-update,delete 级联保存、更新、删除all 同上。级联保存、更新、删除
如果设置了级联:
保存:将对象以及有关联关系的对象一并保存
删除:把对象有关联关系的记录都删除了
inverse和cascade同时使用:
inverse的优先级是比cascade的优先级要高的,因此设置了inverse属性为true,那么cascade就无法实现对应的映射关系了。
Hibernate细节
hibernate是支持数据库连接池,我们可以配置它使用C3P0
逆向工程可以帮我们自动生成实体和映射文件,这样就非常方便了
快速入门
主配置文件
配置数据库信息
配置常用参数
显示sql
自动创建表
格式化sql
加载映射文件
映射文件
即描述Java对象与数据库的映射关系
执行流程
创建Configuation对象
通过 Configuation对象加载主配置文件
创建SessionFactory对象
为每个请求维护一个Session,该Session管理着Connection对象
通过Session对象去实现增删改查
Hiberante涉及的查询
HQL:hibernate query language 即hibernate提供的面向对象的查询语言
QBC查询:query by criteria 完全面向对象的查询
本地SQL查询:有的时候,如果SQL是非常复杂的,我们不能靠HQL查询来实现功能的话,我们就需要使用原生的SQL来进行复杂查询了!
映射文件的ID节点
identity 自增长(mysql,db2)
sequence 自增长(序列), oracle中自增长是以序列方法实现
native 自增长【会根据底层数据库自增长的方式选择identity或sequence】
increment 自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)
指定主键生成策略为手动指定主键的值:assigned
指定主键生成策略为UUID生成的值:uuid
指定主键同时作为外键:foreign
复合主键composite-id
将需要成为复合主键的字段封装成JavaBean对象
该JavaBean对象需要实现Serializable接口
查询详解
原生提供的API
get/load主键查询
对象导航查询
我们可以使用主键查询完之后,得到的对象,直接使用对象得到集合
HQL查询
查询全部列,HQL不支持*号
查询指定的列,返回的是Object[]。也可以封装成对象:session.createQuery("select new Monkey(m.name,m.eatBanana )from Monkey m");
条件查询
可以使用占位符?
也可以使用命名条件 :命名
范围查询
使用between and
模糊查询
在参数上拼接%就行了
聚合函数统计
使用uniqueResult() API
分组查询
迫切连接
我们想把左表的数据填充到右表中,或者将右表的数据填充到左表中…使在返回的时候是一个对象、而不是对象数组
Criteria 查询
Criteria查询使用不了分组、连接查询了。
基本都是封装了大于、小于、等于的API
SQLQuery本地SQL查询
如果写HQL太麻烦了,功能实现复杂我们还是得用原生的SQLHibernate给我们提供了使用原生SQL的API
Hibernate也支持在SQLQuery中对数据进行对象封装,在后面添加一个addlClass就行了
分页查询
Hibernate提供了分页查询的API供我们使用
提供了方法让我们设置起始位置和结束位置
提供了ScrollableResults来得到滚动结果集,最终得到总记录数
滚动结果集是从0开始的,因此需要+1才可得到总记录数
Hibernate缓存
在Hibernate有好几种对象状态
临时/瞬时状态
直接new出来的对象就是临时/瞬时状态的,没有被session管理,没有存到数据库中
持久化状态
当保存在数据库中的对象就是持久化状态了
游离状态
当Session关闭了以后,持久化的对象就变成了游离状态了,不受Session管理,在数据库中有记录
一级缓存
一级缓存其实就是Session缓存,只在Session管理下中有用
不同的Session是不会共享缓存的
缓存相关的方法
session.flush():让一级缓存与数据库同步
session.evict(arg0); 清空一级缓存中指定的对象
session.clear(); 清空一级缓存中缓存的所有对象
懒加载
懒加载就是当使用数据的时候才去获取数据、执行对应的SQL语句
在配置文件可以通过lazy属性来设置懒加载
true 使用懒加载
false 关闭懒加载
extra (在集合数据懒加载时候提升效率)【只有在set、list等集合标签中使用】
懒加载异常
当Session关闭后,就不能使用懒加载了,否则会报出异常
解决方法
先使用一下数据
强迫代理对象初始化:Hibernate.initialize(dept);
关闭懒加载
二级缓存
一级缓存是基于session管理的,而二级缓存是基于应用级别的Hibernate二级缓存:存储的是常用的类
使用二级缓存
开启二级缓存
指定缓存框架
指定哪些类加入二级缓存
集合缓存
把集合设置为二级缓存(Hibernate默认是没有设置的)
查询缓存
想要我们查询出来的数据共享给所有的Session使用,我们可以配置查询缓存
步骤 :
开启查询缓存 <property name="hibernate.cache.use_query_cache">true</property>
在使用程序查询的时候,也要调用setCacheable()方法,设置为查询缓存。
0 条评论
下一页