Hibernate知识点

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值