2、Hibernate持久化编写

一、对于hibernate中的PO编写规则:

1. 必须提供一个无参数的public构造方法

2. 所有属性要private ,对外提供public 的get/set方法

3. 在PO类必须提供一个标识属性,让它与数据库中的主键对应,我们管这个属性叫OID,Hibernate框架它是通过OID来区分不同的PO对象,如果在内存中有两个相同的OID对象,那么hibernate认为它们是同一个对象。

4. PO类中的属性尽量使用基本数据类型的包装类,使用基本数据类型是没有办法去描述不存在概念,如果使用包装类型,它就是一个对象,对于对象它的默认值是null.。

5. PO类它不能使用final修饰符,Get/load方法它们都是根据id去查询对象。

  1. get直接得到了一个持久化类型对象,它就是立即查询操作

  load它得到的是持久化类开的代理类型对象(子类对象)。它采用了一种延迟策略来查询数据。

  2. get方法在查询时,如果不存在返回null

  load方法在查询时,如果 不存在,会产生异常 ObjectNotFoundException.

二、Hibernate主键生成策略

Hibernate中定义的主键类型包括:自然主键和代理主键:

自然主键:具有业务含义 字段 作为主键,比如:学号、身份证号

代理主键:不具有业务含义 字段作为主键(例如 自增id),比如:mysql自增主键,oracle序列生成的主键、uuid()方法生成的唯一序列串

建议:企业开发中使用代理主键!

             

三、Hibernate持久化对象状态持久化对象三种状态

1. 瞬时态:也叫做临时态或自由态,它一般指我们new出来的对象,它不存在OID,与hibernate session无关联,在数据库中也无记录。它使用完成后,会被jvm直接回收掉,它只是用于信息携带。

简单说:无OID 与数据库中的信息无关联,不在session管理范围内。

2. 持久态:在hibernate session管理范围内,它具有持久化标识OID它的特点,在事务未提交前一直是持久态,当它发生改变时,hibernate是可以检测到的。

简单说:有OID 由session管理,在数据库中有可能有,也有可有没有。

3. 托管态:也叫做游离态或离线态,它是指持久态对象失去了与session的关联,托管态对象它存在OID,在数据库中有可能存在,也有可能不存在。

对于托管态对象,它发生改变时hibernet不能检测到。

判断持久化类对象三种状态:

1. 是否有OID

2. 判断是否与session关联

                 

1. 瞬时态(new 出来的)

瞬时------持久  save   saveOrUpdate

瞬时-----脱管(游离)  手动设置oid

2. .持久态   它是由session管理

持久-------瞬时   delete() 被删除后持久化对象不在建议使用

持久-----脱管  注意:session它的缓存就是所说的一级缓存

evict(清除一级缓存 中指定的一个对象)

clear(清空一级缓存)

close(关闭,清空一级缓存)

3. .脱管态   (它是无法直接获取)

脱管-----瞬时    直接将oid删除

脱管----持久  update  saveOrUpdate lock(过时)

四、Hibernate一级缓存

Hibernate的一级缓存就是指session缓存。

                

actionQueue它是一个行列队列,它主要记录crud操作的相关信息,persistenceContext它是持久化上下文,它其实是真正缓存。

在session中定义了一系列的集合来存储数据,它们构成session缓存。只要session没有关闭,它就会一直存在。

当我们通过hibernate中的session提供的一些API例如 save  get  update等进行操作时,就会将持久化对象保存到session中,当下一次在去查询缓存中具有的对象(OID值来判断),就不会去从数据库查询,而是直接从缓存中获取。Hibernate的一级缓存存在的目的就是为了减少对数据库访问。

在hibernate中还有一个二级缓存,它是SessionFactory级别缓存。

示例---演示一级缓存的存在

          

持久化对象具有自动更新数据库能力

          

为什么持久化对象具有自动更新数据库能力

        >

一级缓存常用API

一级缓存特点:

1. 当我们通过session的save,update saveOrupdate进行操作时,如果一级缓存中没有对象,会将这些对象从数据库中查询到,存储到一级缓存。

2. 当我们通过session的load,get,Query的list等方法进行操作时,会先判断一级缓存中是否存在,如果没有才会从数据库获取,并且将查询的数据存储到一级缓存中。

3. 当调用session的close方法时,session缓存清空。

clear 清空一级缓存

evict 清空一级缓存中指定的一个对象。

refresh重新查询数据库,用数据库中信息来更新一级缓存与快照

Hibernate常用API-Session补充update

udpate操作它主要是针对于脱管对象,持久对象具有自动更新能力。

问题1:如果我们直接操作的对象是一个脱管对象,执行update会出现什么情况?

如果对象是一个脱管对象,可以操作,它会将脱管对象转换成持久对象在操作

如果在session中出现相同的oid两个对象,会产生异常

>

问题2脱管对象的oid如果在数据表中不存在,会报异常?

>

所以:在操作中,建议我们通过持久化对象来直接修改其操作。

saveOrUpdate

如果对象是一个瞬时对象 --------执行save操作

如果对象是一个脱管对象---------执行update

如果是一个持久对象-------直接返回

delete

删除一个脱管对象,与session关联,在删除

注意:如果执行delete操作,先删除一级缓存,在删除数据库中的数据。

原文地址:https://www.cnblogs.com/zhh19981104/p/11830199.html

时间: 2024-11-05 00:39:06

2、Hibernate持久化编写的相关文章

(转) Hibernate持久化类与主键生成策略

http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化类 什么是持久化类呢?在Hibernate中持久化类的英文名称是Persistent Object(简称PO),PO=POJO+hbm映射配置文件. 对于Hibernate中的PO,有如下编写规则: 必须提供一个无参数的public构造方法. 所有属性要用private修饰,对外提供public的get/set方法. 在PO类必须提供一个标识属性,让它与

3.1 hibernate持久化类及一级缓存

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

hibernate 持久化对象的生命周期

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

Hibernate持久化对象的三种状态

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

hibernate之模拟Hibernate持久化操作

[Hibernate]之模拟Hibernate持久化操作 使用过Hibernate,大家都知道,由于其面向对象的设计,用起来非常方便,且具有很好的跨数据库性,那么Hibernate的底层是怎么实现的呢?其实也就是将对象模型转化为关系模型,最终还是得sql语句来执行. 看过Hibernate源码的同学应该发现, Hibernate底层的核心是代理和反射,那么由此这样我们就可以理解为什么使用Hibernate在效率上始终是致命的. Ok,下面是一个简单的模拟Hibernate-ORM的save()方

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

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

Hibernate持久化生命周期——三态

通过前几篇博客的大概介绍,我们发现hibernate将业务实体持久化到数据库的工作原理的实现,是通过"映射xml"来衔接的.那么这个xml的由来是哪? 映射文件(hbm)合理的存在的前提就是"有与之对应的实体的存在"--业务实体. 今天这篇博客就来说说实体到数据库的过程,这是一个从代码到数据的持久化过程,就是hibernate实现ORM持久化的生命周期. 一.持久化对象生命周期 下图是hibernate持久化的一个状态图,从图中可以看出,ORM这个过程经历了三个状态

Hibernate初探之单表映射——通过Hibernate API编写访问数据库的代码

编写一个Hibernate例子 第五步:通过Hibernate API编写访问数据库的代码 初始化方法要实现以下功能: 原文地址:https://www.cnblogs.com/songsongblue/p/9523201.html

笔记:Hibernate 持久化类标注示例-双向1-N关系映射

1-N关系的1端持久化类 package org.drsoft.hibernate.model.oneToMany; ? ? import java.util.Date; import java.util.Set; ? ? import javax.persistence.*; ? ? @Entity @Table(name = "OneToMany_One") public class OneToManyForOneModel { @Id @Column(name = "R