深入理解Hibernate
来源:互联网 发布:nginx lua ddos 编辑:程序博客网 时间:2024/05/22 04:28
映射一对多关联关系
一对多双向关联关系映射
例子
用户与订单关系
customer表和order表
order表有个一个字段是customerid
那么在用户的entity中就存在一个set来存放订单
//表明一个用户有多个订单private Set(Order)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
表示使用左外连接检索策略
程序中显示指定左外连接检索策略(程序指定)
- 深入理解Hibernate
- Hibernate--深入理解hibernate日志
- hibernate深入理解-点滴记录
- 深入理解Hibernate的配置文件
- Spring4深入理解----整合Hibernate
- 深入理解hibernate中的API
- 深入理解Hibernate的延迟加载机制
- Hibernate事务并发之深入理解
- hibernate 深入理解持久化对象
- 深入理解Hibernate的三种状态
- Hibernate深入理解----06映射继承关系
- 深入理解hibernate的三种状态
- hibernate 深入理解持久化对象
- 深入理解Hibernate中Iterate方法
- Hibernate深入理解----Hibernate 检索方式(HQL,QBC,本地SQL)
- 深入理解hibernate中持久化和序列化
- Hibernate学习笔记(三)深入理解持久化对象
- Hibernate框架学习之二:深入理解持久化对象
- [Leetcode] Bulls and Cows
- EOJ1851 Summing Sums
- RxJava的入门(转载的!!写的非常好!)
- 分布式文件系统FastDFS设计原理
- 队列的链表实现
- 深入理解Hibernate
- 关于java包的理解
- chrome 插件开发之天气预报
- 浅谈HTTP中Get与Post的区别
- vim保存文件”:wq"与“:x"的区别
- 面试宝典第6章_ 1(预处理)
- 第三周 项目二-建设“顺序表”算法库
- 动态规划练习之钢条切割
- python内置函数03