Hibernate框架(持久化类、缓存、事务管理)
持久化类
java类与数据库的表建立了映射关系,该类被称为持久化类
1)、编写规则
①无参构造,使得Hibernate可通过反射建立对象
②私有属性,get/set方法
③持久化类提供一个唯一标识OID与数据库主键对应
④持久化类属性尽量使用包装类(基本数据类型,默认值为0,有些歧义)
⑤持久化类不要使用final修饰(延迟加载需要继承产生代理类,而final修饰的类不能继承,即延迟加载失效)
2)、主键
①分类
自然主键:表中一个字段,实体类中一个具体属性
代理主键:主键的本身不是表中必须的一个字段
实际开发中,尽量使用代理主键, (OCP原则,主键参与有可能需要修改源代码)
②主键生成策略
在实际开发中一般不允许用户手动设置主键,一般将主键交给数据库,手动编写程序进行设置。
3)、持久化类的三种状态
hibernate是持久层框架,通过持久化类完成ORM操作。为了更好的管理持久化类,将持久化类分成三种状态。
持久化类=java类 + 映射
①瞬时态(transient)
没有唯一的OID,没有被session管理
②持久态(persistent)
有唯一的OID,有被session管理
③脱管态(detached)
有唯一的OID,没有被session管理
状态变换:刚new(瞬时态)、设置OID,并使用Session操作(持久态)、关闭session(托管态)
4)、三种状态转换
5)、持久态对象的特性
持久态对象可自动更新数据库:通过数据库获取到持久态对象后,更新数据的同时会自动更新数据库
底层原理,一级缓存。
缓存
1)、概述
将数据存入到内存中,使用的时候直接从缓存中获取,不用通过存储源
2)、一级缓存
Session级别的缓存(由Session中的一系列java集合构成),自带不可卸载
①特殊区域:
快照区:persistenceContext.entityEnteryContext.head.entityEntry.loadedState
缓存区:persistenceContext.entitiesByKey.table
当获取到持久对象时,会在缓存区存储一份,在快照区存储一份(一个map关系)
修改数据时,会修改缓存区的数据
提交事务时,会比较缓存区和快照区,若不一致则会更新数据库
例:
①执行查询后,缓存区和快照区都存储了数据
缓存区:
快照区:
②执行更新操作后,缓存区和快照区不相同
缓存区改变:
快照区不变:
②清空缓存
session.clear():清空所有缓存
session.evict(对象):清除某个对象的具体缓存
3)、二级缓存
SessionFactory级别的缓存,需配置
事务管理
1)、设置事务隔离级别
从轻到重:1、2、4、8
在核心配置文件中:
<property name="hibernate.connection.isolation">value</property>
2)、线程绑定
①Service层封装业务逻辑操作,而Dao层是封装数据源的单一操作
则事务需要添加在事务层上
此时需要保证多个操做的连接对象是同一个:向下传递、使用线程绑定(ThreadLocal)
Ps:这时执行完一个操作后,不应提交事务和关闭session
②Hibernate框架内部已经绑定好了ThreadLocal
在核心文件配置:
<property name="hibernate.current_session_context_class">value</property>
value有三个值:thread(对象声明周期与本地线程绑定)、jta(与JTA事务绑定)、managed(委托程序管理)
调用:getCurrentSession();
建立一个Utils来管理连接:
public class SessionUtil {private static SessionFactory sFactory;static {Configuration con = new Configuration().configure();sFactory = con.buildSessionFactory();}/*** 获取Session对象* @return*/public static Session getSession() {return sFactory.openSession();}/*** 关闭Session对象* @param session*/public static void closeSession(Session session) {session.close();} /*** 利用线程绑定,完成跨类事务* @return*/public static Session getCurrentSession() {return sFactory.getCurrentSession();}
}
Hibernate框架(持久化类、缓存、事务管理)相关推荐
- hibernate教程--持久化类状态详解
一. Hibernate的持久化类状态: 1.1 Hibernate的持久化类状态 持久化类:就是一个实体类 与 数据库表建立了映射. Hibernate为了方便管理持久化类,将持久化类分成了三种状态 ...
- hibernate教程--持久化类状态
一. Hibernate的持久化类状态: 1.1Hibernate的持久化类状态 持久化类:就是一个实体类 与 数据库表建立了映射. Hibernate为了方便管理持久化类,将持久化类分成了三种状态. ...
- Spring整合Hibernate 二 - 声明式的事务管理
Spring大战Hibernate之声明式的事务管理 Spring配置文件: 添加事务管理类的bean: <bean id="txManager" class="o ...
- Spring 框架基础(05):事务管理机制,和实现方式
本文源码:GitHub·点这里 || GitEE·点这里 一.Spring事务管理 1.基础描述 Spring事务管理的本质就是封装了数据库对事务支持的操作,使用JDBC的事务管理机制,就是利用jav ...
- Spring - Java/J2EE Application Framework 应用框架 第 7 章 事务管理
第 7 章 事务管理 7.1. Spring事务抽象 Spring提供了一致的事务管理抽象.这个抽象是Spring最重要的抽象之一, 它有如下的优点: 为不同的事务API提供一致的编程模型,如JTA. ...
- Hibernate学习(二)持久化类,主键生成策略、一级缓存、事务
持久化类: 持久化:将内存中的一个对象持久化到数据库中的过程.hibernate是持久层的ORM框架 持久化类:java中的一个对象和数据库表建立了映射关系,就可以称为持久化类,java类+映射文件. ...
- Hibernate——(3)主键生成策略持久化类的三种状态
一 持久化类 1.持久化:内存对象--->数据库(硬盘)Hibernate持久化的框架 持久化类:Java对象与数据库中的表建立映射关系 Hibernate就称为持久化类( ...
- (转) Hibernate持久化类与主键生成策略
http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化类 什么是持久化类呢?在Hibernate中持久化类的英 ...
- Spring框架(下)JdbcTemplate、声明式事务管理
Spring框架(下)JdbcTemplate.声明式事务管理 (一)使用JdbcTemplate 1.概述 为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个 ...
- spring框架学习 - Data Access之 事务管理 - 声明式事务管理
接上一篇博客:https://blog.csdn.net/qq_43605444/article/details/122085016?spm=1001.2014.3001.5502 4.声明式事务管理 ...
最新文章
- 02CSS基础选择器
- 修改 wordpress 后台管理员登录地址
- 2016年第七届蓝桥杯C/C++ C组国赛 —— 第二题:反幻方
- C#实现 UDP简单广播
- struts+hibernate+oracle+easyui实现lazyout组件的简单案例——工具类
- 行上下移动_这有一台你迟早要用到的手持式“移动空调”
- CRM 客户端程序开发:设置实体表单界面字段的值
- 2018腾讯内部转岗面试题3——找出数组中比左边大比右边的小的元素
- non-rigid shape registration using similarity-invariant differential coordinates
- 计算纯文本情况下RichTextBox实际高度的正确方法(.NET)
- 采用dlopen、dlsym、dlclose加载动态链接库【转】
- 计算机考研政治考哪些知识,带你了解408考研大纲,及21考研政治复习建议
- 接口自动化-Cookie、Session、Token鉴定解决方案
- html设置图片为部分背景颜色,设置HTML的一个部分作为一个不同的背景颜色
- uni-app 点击生成海报
- writing idiomatic python 读书笔记(5)
- 加油卡充值 数据接口
- CCRC信息安全服务资质分类及申请流程
- Kitty中的动态线程池支持Nacos,Apollo多配置中心了
- python生成车架号
热门文章
- leetcode 实现 strStr()
- C#LeetCode刷题之#16-最接近的三数之和(3Sum Closest)
- java @Column 引发的一点思考
- 垃圾回收算法的实现原理_有关垃圾回收算法工作原理的动画指南
- 一键设置mac显示选项_如何通过关闭浏览器中的一个选项卡将Mac上的电池寿命延长一倍...
- PyTorch学习(7)-Seq2Seq与 Attention
- Python | 面试必问,线程与进程的区别,Python中如何创建多线程?
- 全程干货,requests模块与selenium框架详解
- 牛逼了!Python 开发植物大战僵尸游戏
- 不到 100 行 Python 代码徐峥变葛优