深入理解Hibernate

来源:互联网 发布:nginx lua ddos 编辑:程序博客网 时间:2024/05/22 04:28

映射一对多关联关系

一对多双向关联关系映射

例子
用户与订单关系
customer表和order表
order表有个一个字段是customerid

那么在用户的entity中就存在一个set来存放订单

//表明一个用户有多个订单private SetOrder)orders=new HashSet<Order>();

在 订单 的entity中有个 用户对象

//表明一个订单只有一个用户private Customer customer;

简单看看customer映射文件

<hibernate-mapping>    <class name="xxxx.entity.Customer" table="customer">        <id name="id" type="long" column="ID">            <generator class="increment" />        </id>        <property name="name" type="string">            <column name="NAME" length="15" />        </property>        <set name="orders" cascade="all-delete-orphan" inverse="true">            <key column="CUSTOMER_ID" />            <one-to-many class="xxx.entity.Order" />        </set>    </class></hibernate-mapping>

order的映射文件

<hibernate-mapping>    <class name="xxx.eneity.Order" table="order">        <id name="id" type="long" column="ID">            <generator class="increment" />        </id>        <many-to-one name="customer" column="CUSTOMER_ID" class="xx.entity.Customer" cascade="save-update" />    </class></hibernate-mapping>

说明
inverse 只在集合标记的元素中,默认false
如果false表示对集合的修改会反应到数据库中
如果为true表示对集合的修改不会反应到数据库中(指定方向)
这里写图片描述

一对多双向自身关联映射

(树结构)
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

级联操作对象

Hibernate缓存机制

hibernate一级缓存,

又称session缓存,hibernate内置的,不可卸载的

1、Session的save()方法持久一个对象后,该对象加入到Session的缓存中,以后即使应用程序中的引用变量不再引用改对象,只要session的缓存没有被清空,该对象任然处于生命周期

2、挡Session的get()方法试图从数据库中加载对象时,Session优先判断缓存是否存在该对象,如果存在,则不需要去 数据库中检索

对象缓存是在内存中的

作用

1、减少数据库的访问次数,
2、保证缓存和数据库的一致性。当缓存的对象变化后,不会马上执行sql ,这使得Session能把几条相关的sql 合并成一条sql 来执行

Session清理缓存

清理缓存是指按照缓存的中对象的属性变化来同步更新数据库
清理缓存的时间点
1、调用commit(),commit()方法先清理缓存,然后再向数据库提交事物
2、调用Query查询接口等执行查询操作时候,如果缓存中持久化了对象的属性变化,就会先清理缓存,以保证查询结果为最新
3、显示调用Session的flush()方法的时候

hibernate二级缓存

又称sessionFactory缓存,需要插件,可选,
可以在每个类或每个集合的颗粒度上配置二级缓存

配置了二级缓存,查询的顺序将会是 一级缓存–》二级缓存–》数据库

hibernate对象的状态

临时状态

持久化状态

游离状态

删除状态

这里写图片描述

这里写图片描述

这里写图片描述

Hibernate的检索策略

立即检索策略(配置文件中配置)

缺点:sql 太多,出现 sql n+1问题
没有遵循按需查找

延迟检索策略(配置文件中配置)

一对多的关联关系中,对于<set>元素,应该优选考虑使用该策略,

<set name="orders" inverse="true" lazy="true">

必须 Session close 关闭之前使用

左外连接检索策略(配置文件中配置)

左外连接检索策略,能使用sql的外连接查询,将需要加载的关联对象加载到缓存中
<many-to-one>元素的fetch属性设置为join
表示使用左外连接检索策略

程序中显示指定左外连接检索策略(程序指定)

这里写图片描述

0 0
原创粉丝点击