Hibernate 持久化对象和一级缓存

关于如何手动创建Hibernate,Hibernate初了解已经介绍了,接下来了解持久化对象和一级缓存。

Hibernate的持久化类有三种状态:

1、Transient瞬时态:持久化对象没有唯一标识OID,没有纳入Session的管理。

  2、Persistent持久态:持久化对象有唯一标识OID,已经纳入到Session的管理,另外,持久化具有自动更新数据库的特点

  3、Detached脱管态:持久化对象有唯一标识OID,没有纳入到Session管理。

下面给出一段代码来区分这三种状态:

 1 // 区分持久化对象的三种状态:
 2 public void demo1(){
 3     // 1.创建Session
 4     Session session = HibernateUtils.openSession();
 5     // 2.开启事务
 6     Transaction tx = session.beginTransaction();
 7
 8     // 向数据库中保存一本图书:
 9     Book book = new Book();    // 瞬时态:没有唯一标识OID,没有与session关联.
10     book.setName("Hiernate开发");
11     book.setAuthor("孙XX");
12     book.setPrice(65d);
13
14     session.save(book); // 持久态:有唯一标识OID,与session关联.
15
16     // 3.事务提交
17     tx.commit();
18     // 4.释放资源
19     session.close();
20
21     book.setName("Struts2开发"); // 脱管态:有唯一的标识,没有与session关联.
22 }

另外,三种状态对象的转换如下:

瞬时态:
	获得:
	Book book = new Book();

	瞬时--->持久
	* save(book);
	* save()/saveOrUpdate();
	瞬时--->脱管
	* book.setId(1);
持久态:
	获得:
	Book book = (Book)session.get(Book.class,1);
	* get()/load()/find()/iterate();

	持久--->瞬时:
	* delete(book);
	* 特殊状态:删除态.(被删除的对象,不建议去使用.)

	持久--->脱管:
	* session.close();
	* close()/clear()/evict();
脱管态:
	获得:
	Book book = new Book();
	book.setId(1);

	脱管--->持久:
	* session.update();
	* update()/saveOrUpdate()/lock()

	脱管--->瞬时:
	* book.setId(null);

上面我们提到了持久化对象具有自动更新数据库的特点,其根本原因是依赖于hibernate的一级缓存。

在hibernate中,分成两个基本的缓存:

一级缓存和二级缓存,其实还有个缓存,名为查询缓存,也有书籍把其命名为三级缓存,下面我就先介绍一级缓存。

一级缓存:Session级别的缓存,一级缓存与session的生命周期一致,是自带的,不可卸载。

至于缓存的好处,无非提高效率。

演示:

 1 // 证明一级缓存的存在
 2 public void demo3(){
 3     // 1.创建Session
 4     Session session = HibernateUtils.openSession();
 5     // 2.开启事务
 6     Transaction tx = session.beginTransaction();
 7
 8     // save方法可以向一级缓存中存放数据的.
 9     /*Book book = new Book();
10     book.setName("JQuery开发");
11     book.setAuthor("张XX");
12     book.setPrice(45d);
13
14     Integer id = (Integer) session.save(book);
15
16     Book book2 = (Book) session.get(Book.class, id);
17
18     System.out.println(book2);*/
19
20     // 分别用get执行两次查询.
21     Book book1 = (Book) session.get(Book.class, 1);// 马上发生SQL去查询
22     System.out.println(book1);
23
24     Book book2 = (Book) session.get(Book.class, 1);// 不发生SQL,因为使用一级缓存的数据
25     System.out.println(book2);
26
27     // 3.提交事务
28     tx.commit();
29     // 4.关闭资源
30     session.close();

当session加载了customer对象后,会为customer对象的值类型的属性复制一份快照,也就是在一级缓存中的快照区copy一份相同的数据。

当刷出缓存时,通过比较对象的当前属性和快照,来判断对象的哪些属性发生了变化,如果数据一致,不更新,如果数据不一致,自动更新数据库。

在hibernate中,我们可以通过一些方法来管理一级缓存:

一级缓存是与session的生命周期相关的.session生命周期结束,一级缓存销毁了.

clear()            :清空一级缓存中所有的对象.evict(Object obj)  :清空一级缓存中某个对象.flush()            :刷出缓存.refresh(Object obj):将快照区的数据重新覆盖了一级缓存的数据.

另外,关于一级缓存的刷出时机

FlushMode:
* ALWAYS	    :每次查询的时候都会刷出.手动调用flush.事务提交的时候.
* AUTO		    :默认值.有些查询会刷出.手动调用flush.事务提交的时候.
* COMMIT	    :在事务提交的时候,手动调用flush的时候.
* MANUAL	    :只有在手动调用flush才会刷出.

严格程度:MANUAL > COMMIT > AUTO > ALWAYS

h4 { text-indent: 0.74cm; margin-top: 0.49cm; margin-bottom: 0.51cm; direction: ltr; color: rgb(0, 0, 0); line-height: 156%; page-break-inside: avoid }
h4.western { font-family: "Cambria", "Palatino Linotype", serif; font-size: 14pt }
h4.cjk { font-family: "宋体"; font-size: 14pt }
h4.ctl { font-family: "Times New Roman", serif; font-size: 14pt }
p { text-indent: 0.74cm; margin-bottom: 0.25cm; direction: ltr; color: rgb(0, 0, 0); line-height: 120% }
p.western { font-family: "Times New Roman", serif; font-size: 10pt }
p.cjk { font-family: "宋体"; font-size: 10pt }
p.ctl { font-family: "宋体"; font-size: 10pt }
a:link { color: rgb(0, 0, 255); text-decoration: none }
a:visited { color: rgb(128, 0, 128); text-decoration: none }
a.western:visited { }
a.cjk:visited { }
a.ctl:visited { }
-
--> { }

时间: 2024-10-26 21:03:46

Hibernate 持久化对象和一级缓存的相关文章

3.1 hibernate持久化类及一级缓存

1.持久化类编写规则 Hibernate是持久化层的ORM映射框架,专注于数据的持久化工作. 持久化:所谓的持久化就是讲内存中的数据永久保存到关系型数据库中. 持久化类:其实所谓的持久化类指的是一个Java类与数据库表建立了映射关系,那么这个类称为是持久化类.其实,你可以简单的理解为就是一个Java类,该类通过一个映射文件与数据库的表建立了关系.持久化类的编写规则如下: 1.持久化类提供无参数构造:因为在hibernate的底层需要使用反射生成类的实例: 2.成员变量私有,提供共有get/set

hibernate持久化类和一级缓存

持久化类编写规则 1.有无参构造函数. 2.属性不能被final修饰. 3.对外提供属性的get和set方法. 4.需要提供一个持久化OID对象唯一标识对象. 主键生成策略 <!-- <generator class="native"/>包括sequence和 identity--> <!-- <generator class="increment"/>适用于单线程使用,采用hibernate主键生成策略,最大id加1成为新

Hibernate持久化对象的状态

1. 站在持久化的角度 , Hibernate 把对象分为 4 种状态 : 持久化状态, 暂时状态, 游离状态(脱管状态) , 删除状态.Session 的特定方法能使对象从一个状态转换到还有一个状态 . 2. 暂时状态(Transient) : 1). 在使用代理主键的情况下 , OID 通常为 null 2). 不处于 Session 的缓存中 3). 在数据库中没有相应的记录 3. 持久化状态(也叫"托管" )( Persist) 1). OID 不为 null 2). 位于 S

Hibernate持久化对象的三种状态

在Hibernate中,持久化对象在被操作的过程中可以分为三个时期,这三个时期是和Session的周期相关的,因为Hibernate中的操作都是基于Session完成的.Session的特定方法能使对象从一个状态转换到另一个状态. 持久化对象的生命周期有三种,瞬时状态.持久状态和分离状态.如下图: 瞬时态 不曾进行持久化,未与任何Session相关联.此状态的对象是用new关键字创建出来的,此时对象没有和数据库中记录对应. //Transient状态 Useruser = new User();

【hibernate进阶】hibernate持久化对象的三种状态

Hibernate持久化对象的三种状态:瞬时对象(Transient Objects),持久化对象(Persist Objects),离线对象(Detached Objects). 三种状态:    瞬时对象(Transient Objects):使用new 操作符初始化的对象不是立刻就持久的.它们的状态是瞬时的,也就是说他们没有任何跟数据库表相关联的行为,只要应用不在引用这些对象(不再被任何其他对象所引用),它们的状态将会丢失,并由垃圾回收机制回收. 持久化对象(Persist Objects

在Hibernate框架中详谈一级缓存

在学习Hibernate的过程中我们肯定会碰上一个名词---缓存,一直都听说缓存机制是Hibernate中的一个难点,它分为好几种,有一级缓存,二级缓存和查询缓存 今天呢,我就跟大家分享分享我所理解的一级缓存 要想完美的体现出缓存机制的话,我想通过查询语句生成的sql应该就能够很清楚的看到 那些Hibernate的配置信息我就不展示了,直接看关键代码 场景:我要查询同一个对象,查询两次,观察在不同的情况下,sql语句的生成情况 我事先准备了一个HibernateUtil工具类,具体如下 pack

hibernate 持久化对象的生命周期

包括三种状态:瞬态(自由态),持久态,托管态(游离态) 自由态 持久化对象的自由态,指的是对象在内存中存在,但是在数据库中并没有数据与其关联. 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象的变化将会被同步到数据库中. 游离态 处于持久态的对象,在其对应的Session实例关闭后,此时对象进入游离态.也就是说Session实例是持久态对象的宿主环境,一旦宿主环境失效,那么持久态对象迚入游离状态. session.beginTransaction(); Us

Hibernate 持久化对象状态

持久化对象PO类状态 1.状态分类    transient  瞬时态:hibernate的session缓存中没有存放,数据库中没有数据.例如新建的po类,没有OID值 persistent  持久态:hibernate的session缓存中存放,数据库中最终会有.例如save(po) 完成commit操作,有OID值 detached   脱管态:hibernate的session缓存中没有,数据库中有数据.脱离session的管理,有OID值  2.OID OID:hibernate用于标

hibernate持久化对象三种状态及其转换

持久化类类三种状态介绍1. 瞬时态:也叫做临时态或自由态,它一般指我们 new 出来的对象,它不存在 OID, 与 hibernate session 无关联,在数据库中也无记录.它使用完成后,会被 jvm 直接 回收掉,它只是用于信息携带.简单说:无 OID 与数据库中的信息无关联,不在 session 管理范围内.2. 持久态:在 hibernate session 管理范围内,它具有持久化标识 OID 它的特点,在事 务未提交前一直是持久态,当它发生改变时, hibernate 是可以检测