Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >hibernate系列之二

hibernate系列之二

作者头像
沁溪源
发布于 2020-09-03 03:15:49
发布于 2020-09-03 03:15:49
46500
代码可运行
举报
文章被收录于专栏:沁溪源沁溪源
运行总次数:0
代码可运行

首先先介绍一下持久化:

持久化:将程序数据在持久状态和瞬时状态间转换的机制;即将内存的数据永久存在关系型数据库中;

持久化类的编写规则:

  持久化类需要提供无参构造方法;

  持久化类的属性需要私有,对私有的属性提供get/set方法;

  持久化类的属性尽量使用包装类的类型;

  持久化类要有一个唯一标识OID与表的主键对应;

  持久化类尽量不要使用final进行修饰;

谈到持久化类就必然会了解持久化对象,那首先就必须来了解持久化对象的三种状态:瞬时态、持久态、脱管态

  瞬时态(Transient):瞬时态的实例是由new命令创建、开辟内存空间对象,不存在持久化标识OID,尚未与hibernateSession关联,在数据库中没有记录,失去引用后别JVM回收;

  持久态persistent:持久态的对象存在持久化标识ID,加入Session缓存中,数据库中存在相应的记录,且相关联的session没有关闭;是在事务还没有提交变成持久态的;持久态对象能够自动更新数据库就是依赖的一级缓存(快照区)

  脱管态(detached):当某个持久化状态的实例与session的关联被关闭时就变成了脱管态;

脱管态对象存在持久化标识OID并且在数据库中的数据存在关联,只是失去了与当前session的关联;

         三种状态转换

解析:

当一个对象被执行new关键字创建以后,该对象处于瞬时态;

当瞬时态对象执行session的save()或者saveOrUpdate()方法后,该对象将被放入Session的一级缓存中,对象进入持久态;

当持久态对象执行close()、clear()方法,对象进入脱管态;

当直接执行session的get() load() find() 等从数据库中查询对象时,查询的对象也会处于持久态;

当对数据库中的记录进行update()、saveOrUpdate()等,脱管态的对象就会过渡到持久态;

明白这些持久化对象的状态之后再仔细说明一下hibernate中缓存,hibernate中有两种缓存状态;一级缓存、二级缓存;

面试题:叙述一级缓存和二级缓存之间的区别???

叙述session的作用和特点???

上面的问题有兴趣的伙伴们可以留言哦,大家一起提升。

hibernate的一级缓存就是session缓存,session缓存就是一块内存空间,用来存放java对象;

hibernate的session缓存,在查询对象时,会使用对象的属性先在一级缓存中查询,如果匹配到OID的对象,则直接从一级缓存中取出,不会再从数据库中查询;如果在缓存中没有找到相同的对象,则会再去数据库中查找相应的数据信息;

所以session缓存的特点:减少访问数据库的次数;

再问下小伙们关于session的清空数据和清理的区别??

session 清理缓存是指按照缓存中的对象状态的变化同步更新数据库;

清空session是指将session关闭;

介绍一下一级缓存的内部结构:(块照区)

hibernate向一级缓存中放入数据时,同时会复制一份数据放入到hibernate快照中,当使用commit()方法提交事务时,同时会清理session的一级缓存(更新数据库),这时会使用OID判断一级缓存中的对象和快照区 的对象是否一致,如果两个对象中的属性发生变化,则会执行update语句,将缓存的内容同步到数据库中,并更新快照;

如果不一致,则不执行update语句;hibernate快照的作用就是确保一级缓存中的数据和数据库中的数据保持一致;

下面使用上一次运行的程序,验证一级缓存;

需要改变的是,新建一个测试工具类hibernateUtil:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.itwx.hibernate.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

	/**
	 * 由于SessionFactory是线程安全,一个实例可以多个线程共享
	 */
	private static final Configuration config;
	private static final SessionFactory sessionFactory;
	static {//静态代码块,随着类的加载执行一次;
		config= new Configuration().configure();
		sessionFactory = config.buildSessionFactory();
	}
	/**
	 * 定义得到Session的方法
	 */
	public static Session openSession(){
		return sessionFactory.openSession();
	}
}

在测试类中,需要改变获取session的方式,使用工具类获取即可;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
	public void test2() {
		//使用工具类获取session
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		//获取数据库中的对象:第一次从数据库中查询,同时将数据存到一级缓存中
		Customer customer1 = session.get(Customer.class, 8l);
		System.out.println(customer1);
		//从一级缓存中获取数据对象,不再访问数据库
		Customer customer2 = session.get(Customer.class, 8l);
		System.out.println(customer2);
		System.out.println(customer1 == customer2);
		//提交事务
		transaction.commit();
		//关闭资源
		session.close();
	}

执行结果分析:

执行SQL查询语句,先从数据库中查询

Hibernate: select customer0_.cust_id as cust_id1_0_0_, customer0_.cust_name as cust_nam2_0_0_, customer0_.cust_source as cust_sou3_0_0_, customer0_.cust_industry as cust_ind4_0_0_, customer0_.cust_level as cust_lev5_0_0_, customer0_.cust_phone as cust_pho6_0_0_, customer0_.cust_mobile as cust_mob7_0_0_ from customer customer0_ where customer0_.cust_id=?

得到对象 com.itwx.hibernate.pojo.Customer@62679465

第二次获取对象:直接从缓存中获取,不在执行SQL语句 com.itwx.hibernate.pojo.Customer@62679465 true

以上是关于hibernate持久化相关的总结,如果有错误之处,请及时指正;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/06/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
[ SSH框架 ] Hibernate框架学习之二
一、Hibernate持久化类的编写规范 1.什么是持久化类  Hibernate是持久层的ORM影射框架,专注于数据的持久化工作。所谓持久化,就是将内存中的数据永久存储到关系型数据库中。那么知道了什么是持久化,什么又是持久化类呢?其实所谓的持久化类指的是一个Java类与数据库表建立了映射关系,那么这个类称为是持寺久化类。其实可以简单的理解为持久化类就是一个Java类有了一个映射文件与数据库的表建立了关系。那么我们在编写持久化类的时候有哪些要求呢?接下来我们来看一下: 2.持久化类的编写规则(应该遵循Ja
Kevin_Zhang
2018/05/22
8310
Hibernate第二天:Hibernate的一级缓存、其他的API
持久化,将内存中的一个对象持久化到数据库的过程。Hibernate框架就是用来进行持久化的框架。
AlbertYang
2020/09/08
7050
SSH框架之Hibernate第二篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/09/18
5250
Hibernate_day02总结
Hibernate_day02总结 今日内容 l Hibernate持久化对象的状态 l Hibernate的一级缓存 l Hibernate操作持久化对象的方法 l Hibernate 关联关系映射 1.1 上次课内容回顾: Hibernate框架的概述. * 什么是Hibernate * 持久层的ORM框架. * ORM:对象关系映射. * 常见的持久层框架 * JPA * Hibernate * Mybatis * JdbcTemplate * Hibernate流行版本: * 3.x和4.x H
Java帮帮
2018/03/19
1.5K0
Hibernate_day02总结
Hibernate学习笔记2
定义hbm.xml映射文件和pojo类时都需要定义主键,Hibernate中定义的主键类型包括:自然主键和代理主键:
Java学习
2018/07/25
1.4K0
Hibernate学习笔记2
[Java面试八]Hibernate总结以及在面试中的一些问题.
1.为什么要使用Hibernate开发你的项目呢?Hibernate的开发流程是怎么样的? 为什么要使用 ①.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
一枝花算不算浪漫
2018/05/18
1.6K0
Hibernate的缓存机制如何应用?
2.一级缓存应用: save()。当session对象调用save()方法保存一个对象后,该对象会被放入到session的缓存中。 get()和load()。当session对象调用get()或load()方法从数据库取出一个对象后,该对象也会被放入到session的缓存中。 使用HQL和QBC等从数据库中查询数据。
小小鱼儿小小林
2020/06/24
4570
SSH框架之旅-hibernate(2)
下面展示了两种方式来删除一条记录,但建议使用第一种,先查询后删除的方式,应该避免第二种直接设置主键对应属性值的方式。
Wizey
2018/08/30
9390
SSH框架之旅-hibernate(2)
Hibernate_day03总结
Hibernate_day03总结 今日内容 l Hibernate的检索方式 l Hibernate的抓取策略 l Hibernate的批量检索 l 事务的并发问题 1.1 上次课内容回顾: Hibernate的持久类三种状态: * 瞬时态:没有唯一标识OID,没有被session管理 * 持久态:有唯一标识OID,被session管理 * 脱管态:有唯一标识OID,没有被session管理. * 状态转换: 瞬时态:new 获得. * 瞬时à持久:save/saveOrUpdate * 瞬时à脱管:
Java帮帮
2018/03/19
1.1K0
Hibernate_day03总结
day30_Hibernate学习笔记_02
对象状态 瞬时态|临时态:Transient     1、没有与Hibernate产生关联(没有与Session有关联)。     2、与数据库中的记录没有产生关联,即对象没有ID(有关联:就是与数据库中的ID有对应)。 持久态:Persistent     1、与Hibernate有关联(与session有关联)。     2、对象有ID。 游离态|脱管态:Detached     1、没有与Hibernate产生关联。     2、对象有ID。 三种状态转换如下图所示:
黑泽君
2018/10/11
1.1K0
day30_Hibernate学习笔记_02
Hibernate二级缓存的使用「建议收藏」
SessionFactory 级别缓存 —- 二级缓存(进程范围)
全栈程序员站长
2022/08/31
1.3K0
Hibernate二级缓存的使用「建议收藏」
hibernate系列之一
通过自己不断的学习框架以及相关知识的学习,自己学会总结了学习路上遇到的一些问题以及疑惑,自己现在跟着相关的学习资料又进行了一些总结和实践,希望通过自己走过的学习之路能够帮助小伙伴们解决一些学习上问题或者存在的疑问。
沁溪源
2020/09/03
5830
Hibernate_day04总结
更多资源分享就在【Java帮帮】微信公众号与QQ空间 Hibernate_day04总结 今日内容 l Hibernate的二级缓存 1.1 上次课内容回顾: Hibernate的检索方式 * 对象导航的方式:customer.getOrders() * OID检索方式:get/load * HQL检索: * 简单查询:from Customer * 别名查询:from Customer as c * 多态查询:from java.lang.Object * 排序查询:from Customer ord
Java帮帮
2018/03/19
6490
Hibernate_day04总结
hibernate框架中对象的状态
increment:hibernate先会查询数据最大id值,然后在最大值加1在进行保存操作。 hibernate:select max(id) from t_user; insert into
全栈程序员站长
2022/06/30
8580
持久化类与缓存
持久态:已经有了id,调用session方法,把对象给session,才被session所管理,添加到session之后, 对象一直处理持久态,当对象处理持久态时, 可以自动更新数据库
木瓜煲鸡脚
2019/09/10
8210
持久化类与缓存
Hibernate第三天:Hibernate的一对多配置、Hibernate的多对多的配置
* * 前提:一对多的双方都设置cascade="save-update"
AlbertYang
2020/09/08
1.9K0
Hibernate第三天:Hibernate的一对多配置、Hibernate的多对多的配置
[ Java面试题 ]持久层篇
1、什么是ORM?   对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术;   简单的说,ORM是通过使用描述对象和数据库之间映射的元数据(在Java中可以用XML或者是注解),将程序中的对象自动持久化到关系数据库中或者将关系数据库表中的行转换成Java对象,其本质上就是将数据从一种形式转换到另外一种形式。 2、Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗(两个
Kevin_Zhang
2018/05/22
1.4K0
hibernate笔记加强版「建议收藏」
hibernate事实上就是ormapping框架,此框架的作用就是简单话数据库的操作。
全栈程序员站长
2022/07/10
1.1K0
java面试题 --- Mybatis&Hibernate
贪挽懒月
2023/10/16
1780
day30_Hibernate复习_02(补刀)
对象的三种状态:     瞬时态:对象刚刚创建,没有与session关联,没有ID     持久态:已经和Session关联,有ID     游离态:没有和session关联,有ID     瞬时=>持久   save/persist     瞬时=>游离   setId     持久=>游离   close/evict/clear     持久=>瞬时   close/evict/clear 再 将ID设置为null     游离=>瞬时   将ID设置为null     游离=>持久   update/saveOrUpdate 持久状态的特性:持久对象的所有变化,会被自动同步到数据库中。 一级缓存:     Hibernate中有两种缓存:线程级别的session缓存 和 进程级别的sessionFactory缓存(不久就会学到啦)   在Session对象中,有一个缓存。 本质:Map集合、键是ID、值是对象,Hibernate会把所有查询到的对象,放入缓存中。         如果再次查询相同的对象,会先从缓存中找。目的:为了提高效率。 快照:快照是为了对比缓存中的对象是否发生变化,来决定事务提交时,是否需要修改数据。 其他api:     evict();    将缓存中的对象移除     clear();    清空一级缓存     refresh(Object);    刷新 => 强制刷新缓存中的对象 => (可以用来解决缓存与数据库数据不同步的问题(局部解决))     flush();    对比快照,并提交缓存对象     saveOrUpdate(Object);    可以同时完成保存或更新操作     save/persist     HQL/SQL/Criteria与缓存的关系 => 查询到的对象会放入缓存中,但是每次查询都要发送sql语句。
黑泽君
2018/10/11
3680
相关推荐
[ SSH框架 ] Hibernate框架学习之二
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验