Hibernate【eclipse插件–hibernatetools】
框架 持久化 ORM
类/对象/属性——–表/记录/字段
元数据(XML):对象-关系映射文件
hibernate配置文件:
username/password/driver_class/url
dialect/show_sql/format_sql/
hbm2ddl.auto[update/create/create-drop/validate]
加载对象-关系映射文件
持久化类:无参构造器/标识属性/类字段声明访问方法/非final类/重写eqauls和hashCode方法
对象-关系映射文件
API操作
创建sessionFactory:Configuration serviceRegistry
创建session
开启事务: Transaction
执行操作:api
提交事务:commit/rollback/wasCommitted
关闭session
session缓存【一级缓存】 :API[flush/refresh/clear] 数据状态
持久化对象的状态:session中不能用两个oid相同的对象
临时状态/持久化状态/游离状态/删除状态:session/数据库表的记录
save/persist:oid
get/load:加载对象时机
update/flush :游离对象 select-before-update=true(不建议使用)
saveorupdate:oid
merge:jpa
delete:持久化对象/游离对象 use_identifier_rollback
evict:从session中把指定的持久化对象移除
dowork[调用存储过程]:获取jdbc原生的connection
hibernate与触发器协同工作:flush/refresh/select-before-update=true
c3p0数据源
max_size/min_size/acquire_increment/timeout/idle_test_period/max_statements
jdbc
fetch_size[100]/batch_size[30]只对oracle起作用
对象-关系映射文件
class:package/name/table/dynamic-insert[update]
property:unique/update/index/length/scale/formula
generator:native/hilo/increment/identity[数据库支持自增]/sequence[数据库支持序列]
时间日期类型:java.util.Date java.sql.Date/Time/Timestamp DATE/TIME/TIMESTAMP
长文本:String clob sql-type=”mediumtext”
图片:Blob blob sql-type=”mediumblob”
映射组成关系:compoment parent
映射一对多关联关系:关联是有方向的
many-to-one save顺序【先save一的一端】get赖加载
name: 多这一端关联的一那一端的属性的名字
class: 一那一端的属性对应的类名
column: 一那一端在多的一端对应的数据表中的外键的名字
one-to-many
set: 映射 set 类型的属性, table: set 中的元素对应的记录放在哪一个数据表中. 该值需要和多对一的多的那个表的名字一致
inverse: 指定由哪一方来维护关联关系. 通常设置为 true, 以指定由多的一端来维护关联关系
cascade:设定级联操作.【delete-orphan/save-update】 开发时不建议设定该属性. 建议使用手工的方式来处理
order-by:在查询时对集合中的元素进行排序, order-by 中使用的是表的字段名, 而不是持久化类的属性名
一对一
基于外键:one-to-one[property-ref] many-to-one[unique]
基于主键:采用 foreign 主键生成器策略的一端增加 one-to-one 元素映射关联属性,其 one-to-one 节点还应增加 constrained=true 属性, 以使当前的主键上添加外键约束。
多对多
指定中间表,使用 many-to-many 指定多对多的关联关系. column 执行 Set 集合中的持久化类在中间表的外键列的名称。
映射继承关系
使用 subclass 进行映射
* 缺点:
* 1. 使用了辨别者列.
* 2. 子类独有的字段不能添加非空约束.
* 3. 若继承层次较深, 则数据表的字段也会较多.
使用 joined-subclass 进行映射
* 优点:
* 1. 不需要使用了辨别者列.
* 2. 子类独有的字段能添加非空约束.
* 3. 没有冗余的字段.
使用 union-subclass 进行映射
* 优点:
* 1. 无需使用辨别者列.
* 2. 子类独有的字段能添加非空约束.
* 缺点:
* 1. 存在冗余的字段
* 2. 若更新父表的字段, 则更新的效率较低
查询数据:不浪费内存 更高的查询效率
类级别: class[lazy] 立即检索/延迟检索
一对多/多对多:set[lazy/fetch/batch-size]
一对一/多对一:lazy/fetch/batch-size
检索方式:导航对象图/OID[GET/LOAD]/HQL/QBC/本地SQL
HQL:query【createQuery】对象+hql语句【面向对象sql】+绑定参数【基于命名/位置参数+链式调用】
分页查询:setFirstResult+setMaxResults
query: name –>sql字符串
投影查询:select关键字+对象构造器
报表查询:group by/having/DISTINCT/count/min/max/sum/avg
迫切左外连接【left join fetch】/左外连接【left join】:建议使用left join fetch
迫切内连接【inner join fetch】/内连接【inner join】:建议使用inner join fetch
关联级别运行时的检索策略:hql>xml
QBC: 基于对象的sql Criteria Restrictions Conjunction【AND】 Disjunction【OR】 Projections【统计查询】 Order【排序】
本地SQL【createSQLQuery】:弥补HQL做不了的
hibernate 二级缓存【sessionFactory级别】进程
内置:hibernate自带,不可卸载 只读
外置:可配置的缓存插件【EHCache….】
二级缓存的并发访问策略:非严格读/读写型/事务型/只读型
1. 使用 Hibernate 二级缓存的步骤:
1). 加入二级缓存插件的 jar 包及配置文件:ehcache*.jar ehcache.xml
2). 配置 hibernate.cfg.xml
I. 配置启用 hibernate 的二级缓存:
<property name="cache.use_second_level_cache">true</propert>
II. 配置hibernate二级缓存使用的产品:
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
III. 配置对哪些类使用 hibernate 的二级缓存:
<class-cache usage="read-write" class="com.atguigu.hibernate.entities.Employee"/>
实际上也可以在 .hbm.xml 文件中配置对哪些类使用二级缓存, 及二级缓存的策略是什么.
<cache usage="read-write"/>
2). 集合级别的二级缓存的配置
I. 配置对集合使用二级缓存
<class-cache usage="read-write" class="com.atguigu.hibernate.entities.Employee"/>
<class-cache usage="read-write" class="com.atguigu.hibernate.entities.Department"/>
<collection-cache usage="read-write" collection="empsCache"/>
也可以在 .hbm.xml 文件中进行配置
<set name="emps" table="GG_EMPLOYEE" inverse="true" lazy="true">
<cache usage="read-write"/>
<key>
<column name="DEPT_ID" />
</key>
<one-to-many class="com.atguigu.hibernate.entities.Employee" />
</set>
II. 注意: 还需要配置集合中的元素对应的持久化类也使用二级缓存! 否则将会多出 n 条 SQL 语句.
3). ehcache 的 配置文件
<ehcache>
<!--
指定一个目录:当 EHCache 把数据写到硬盘上时, 将把数据写到这个目录下.
-->
<diskStore path="d:\\tempDirectory"/>
<!--
设置缓存的默认数据过期策略
-->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
<!--
设定具体的命名缓存的数据过期策略。每个命名缓存代表一个缓存区域
缓存区域(region):一个具有名称的缓存块,可以给每一个缓存块设置不同的缓存策略。
如果没有设置任何的缓存区域,则所有被缓存的对象,都将使用默认的缓存策略。即:<defaultCache.../>
Hibernate 在不同的缓存区域保存不同的类/集合。
对于类而言,区域的名称是类名。如:com.atguigu.domain.Customer
对于集合而言,区域的名称是类名加属性名。如com.atguigu.domain.Customer.orders
-->
<!--
name: 设置缓存的名字,它的取值为类的全限定名或类的集合的名字
maxElementsInMemory: 设置基于内存的缓存中可存放的对象最大数目
eternal: 设置对象是否为永久的, true表示永不过期,
此时将忽略timeToIdleSeconds 和 timeToLiveSeconds属性; 默认值是false
timeToIdleSeconds:设置对象空闲最长时间,以秒为单位, 超过这个时间,对象过期。
当对象过期时,EHCache会把它从缓存中清除。如果此值为0,表示对象可以无限期地处于空闲状态。
timeToLiveSeconds:设置对象生存最长时间,超过这个时间,对象过期。
如果此值为0,表示对象可以无限期地存在于缓存中. 该属性值必须大于或等于 timeToIdleSeconds 属性值
overflowToDisk:设置基于内存的缓存中的对象数目达到上限后,是否把溢出的对象写到基于硬盘的缓存中
-->
<cache name="com.atguigu.hibernate.entities.Employee"
maxElementsInMemory="1"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
<cache name="empsCache"
maxElementsInMemory="1000"
eternal="true"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
overflowToDisk="false"
/>
</ehcache>
4). 查询缓存: 默认情况下, 设置的缓存对 HQL 及 QBC 查询时无效的, 但可以通过以下方式使其是有效的
I. 在 hibernate 配置文件中声明开启查询缓存:
<property name="cache.use_query_cache">true</property>
II. 调用 Query 或 Criteria 的 setCacheable(true) 方法
III. 查询缓存依赖于二级缓存
时间戳缓存区域【T1/T2/T3】
list() VS iterate():[要查询的数据表中包含大量字段/启用二级缓存/二级缓存中包含了待查询的对象]
管理session:本地线程绑定/JTA绑定/程序管理
<!-- 配置管理 Session 的方式 -->
<property name="current_session_context_class">thread</property>
session的获取:SessionFactory.getCurrentSession()
若 Session 是由 thread 来管理的, 则在提交或回滚事务时, 已经关闭 Session 了.
批量处理数据【Session/HQL/StatelessSession/JDBC API】:JDBC API