1.hibernate原理
读取并解析配置文件
读取并解析映射信息,创建SessionFactory
打开session
创建事务Transaction
持久化操作
提交事务
关闭session
2.hibernate缓存机制
hibernate提供了缓存机制,对于那些改动不大且经常使用的数据,可以将它们放到缓存中,不必在每次使用时都去查询数据库,提升了性能
1)一级缓存是Session级别的缓存,由Session负责管理,因此一级缓存是Session独享的,即每个Session只能访问自己的一级缓存区
2)二级缓存是SessionFactory级别的缓存,由SessionFactory负责管理,因此二级缓存是Session间共享的,即不同的Session都可以访问二级缓存区,二级缓存默认未启用
一级缓存和二级缓存相同的地方是:他们缓存的都是对象数据
step1:了解二级缓存的策略
EHCache/OSCache/SwarmCache/TreeCache
step2:配置 ehcache.xml,默认放在src下
<defaultCache
maxElementsInMemory="10000" 内存中最大缓存多少个对象
eternal="false" 指定缓存对象是否永久缓存
timeToIdleSeconds="120" 对象被缓存120秒后,依然空闲就要从内存中删除掉
timeToLiveSeconds="120" 对象被缓存120秒之后,不管是否调用都要被删除
overflowToDisk="true" 支持缓存对象溢出后放到磁盘上
/>
<diskStore path="java.io.tmpdir"/> 指定溢出缓存的位置
step3:在主配置文件hibernate.cfg.mxl中启用二级缓存策略
<!-- 启用二级缓存策略为ehcache-->
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
step4:指定哪些对象可以使用二级缓存,需要在对应对象的映射描述文件中指定
例如:User.hbm.xml
<cache usage="read-only" region="sampleCache1"/>
step5:测试
3)查询缓存:基于二级缓存,一般跟二级缓存结合使用,默认未启用
缓存两部分:查询的结果集/hql或者sql语句
step1:二级缓存已经开启的基础之上,在主配置文件中开启查询缓存
<!-- 启用查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>
step2:在执行query.list()之前调用query.setCacheable(true); 指定该查询,使用查询缓存
二级缓存和查询缓存:多个用户频繁使用的对象,是跨用户的
4)管理缓存:如何清除缓存中的对象
session.evict();一级缓存清理
sessionFactory.evict();二级缓存清理
sessionFactory.evictCollection();二级缓存对象集合清理
3.hibernate查询方式
1)使用API查询,如get.load
2)使用hql查询
3)使用sql查询
4)使用Criteria查询
4.延迟加载
1)延迟加载(懒惰加载):使用hibernate方法查询数据时,hibernate返回的只是一个空对象,id外属性都为null,并没有真正查询数据库,而在使用这个
对象时才会触发查询数据库,并将查询到的数据注入到这个空对象中这种将查询时机推迟到对象访问时的机制称为延迟加载
get:立即加载,没有使用延迟加载技术,方法调用后立即返回查询对象
load:懒惰加载,使用延迟加载对象,返回的是一个查询对象的代理对象,对象中的数据是空的2)与延迟加载相关的操作
a.配置文件中配置<class lazy=" "> lazy 属性控制其是否启用延迟加载,默认lazy="true"
b.可以使用Hibernate.initialize(Object proxy)方法,将代理对象加载
c.没有延迟加载机制的get方法
3)hibernate中具有延迟加载机制的查询方法
a.session.load()
b.query.iterate()
c.关联映射中对关联属性的加载
5.hibernate的核心接口
1)Configuration:负责加载主配置文件信息,同时也加载映射关系文件信息
2)SessionFactory:负责创建session对象
3)Session:数据库连接会话,负责执行增删改操作
4)Transaction:负责事务控制
5)Query:负责执行特殊语句
6.为什么要用hibernate
1)对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
2)hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,很大程度简化DAO层的编码
3)hibernate使用反射机制,而不是字节码增强程序来实现透明性
4)hibernate的性能很好,是一个轻量级的框架,映射的灵活性出色,支持各种关系数据库,从一对多到多对多的各种复杂关系
7.主键管理策略 6.1.4.1. Generator
1)配置<id name="id" type="integer">
<column name="id" />
<generator class="native" />
</id>
2)内置管理策略
a.increment:用于为long, short或者int类型生成 唯一标识 先查出最大的id,然后再插入, mysql使用increment不太好,会多一次查询,性能有所下降
b.native:根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
c.identity:对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识 ,字段提供支持.返回的标识符是long, short 或者int类型的。
d.sequence :适用于支持序列的数据库,比如oracle, 在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用
e.uuid:用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
f.assigned:让应用程序在save()之前为对象分配一个标示符。
这是 <generator>元素没有指定时的默认生成策略,让应用程序处理主键
g.hilo/seqhilo :高/低位算法
h.foreign:使用另外一个相关联的对象的标识符.
通常和<one-to-one>联合起来使用
3)自定义主键管理策略
班级号+学号(java01_20161229)
编写主键生成器类:
所有生成器都会实现org.hibernate.id.IdentifierGenerator;接口
increment/identity/select/native/assigned...
8.映射文件中使用的hibernate类型:
hibernate类型指的是映射描述文件中<property>元素的type属性
1)映射java基本类型以及封装类
整数:byte/short/integer/long
浮点型:float/double
布尔型:boolean/yes_no/true_false
2)映射字符串
完成从java.lang.String到数据库中varchar/varchar2
3)映射日期和事件
完成从java.util.Date和java.sql.Date到数据库中
date/time/timestamp
4)映射日期
java.util.Calendar-->calendar/calendar_date
5)映射大数值
从java.math.BigDecimal和java.math.BigInteger-->NUMERIC
orcale-->number
big_decimal-->big_integer
6)映射JDBC
JDBC 类 java.sql.Clob 和 java.sql.Blob的映射。
clob:使用char来保存数据,保存xml文档
blob:保存二进制数据,比如一张图片
7)自定义类型