一、对于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操作,先删除一级缓存,在删除数据库中的数据。
 

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

  1. 1.1Hibernate持久化类和Hibernate持久化对象状态

    一.持久化对象po类 1.po定义 PO,是Persistent Object的缩写,是持久化类.PO是由PO=POJO+hbm映射配置组成. 2.通俗理解 PO类即持久化类,其实就是一个普通的Jav ...

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

    http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化类 什么是持久化类呢?在Hibernate中持久化类的英 ...

  3. Hibernate持久化对象修改id重新保存的办法

    Hibernate持久化对象修改id重新保存的办法——Hibernate学习记录二 2017年11月10日 20:16:48 筱光 阅读数:1122   版权声明:本文为博主原创文章,未经博主允许不得 ...

  4. 06-编写Hibernate API编写访问数据库的代码,使用Junit进行测试

    用到的注解: @Test:测试方法 @Before:初始化方法. @After:是否资源. 先执行Befere,然后执行Test,最后执行After. 第一步:新建一个Junit目录. 第二步:取名 ...

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

    编写一个Hibernate例子 第五步:通过Hibernate API编写访问数据库的代码 初始化方法要实现以下功能:

  6. hibernate 持久化对象 save

    hibernate 持久化对象 save new出来的user对象是游离状态的对象,执行session.save()方法保存后,user对象就变为持久化了,持久化的对象跟数据库表双向绑定的意思, 对象 ...

  7. Hibernate持久化

    一.主键生成策略 1)主键分类:1.自然主键:主键本身就是表中的某一个字段,实体中的一个具体属性,对象本身唯一的特性. 例如:创建一个学生,把其身份证号设为主键 2.代理主键:本身不是表中的一个必须的 ...

  8. Hibernate持久化,生命周期

    一 .生命周期   1.1  . 说明 持久化类就是我们所说的实体类,实体类(持久化类)对象是有状态的. 为什么实体类对象会有状态? 答:由于HIbernate框架是一个先映射,后操作的框架.所谓的状 ...

  9. (补充)06.Hibernate持久化类&持久化对象

    持久化类:就是一个Java类(JavaBean),这个类与表建立映射关系就可以成为是持久类 持久化类 = JavaBean + xxx.hbm.xml 编写规则: 1.提供一个无参数,public访问 ...

随机推荐

  1. RTP中的H264的SVC相关信息

    概览 本文简单的介绍了rtp中的h264的svc相关信息 h264的svc相关格式信息 从RTP Payload Format for H.264 Video可以看见264在rtp的传输过程中,在rt ...

  2. weblogic解决jar包冲突

    前言 在项目中利用POI开发excel.word的导入导出功能,而POI在解析xlsx及docx两种高版本文档时需要依赖xmlbeans包,但weblogic容器中提供了低版本的xmlbeans,从而 ...

  3. 用了 Lambda 之后,发现可以忘记设计模式了

    设计模式是过去的一些好的经验和套路的总结,但是好的语言特性可以让开发者不去考虑这些设计模式.面向对象常见的设计模式有策略模式.模板方法.观察者模式.责任链模式以及工厂模式,使用Lambda表达式(函数 ...

  4. 关于JDK动态代理与Cglib代理

    关于JDK动态代理与Cglib代理 最近有时间学习一下SpringAOP源码,底层用到了代理,大概是这样的: 当需要被代理的类实现了接口,则使用JDK动态代理创建代理对象,增加增强操作执行目标方法 当 ...

  5. 朝花夕拾《精通CSS》一、HTML & CSS 的基础

    一.背景 翻出我4年前看的<精通CSS>一书,可惜当初没有整理读书笔记的习惯,最近又很少写前端,遂很多东西.知识点遗忘了,恰且现在 css 也有些变化和进步,遂一起打包整理,输出成几篇 b ...

  6. TP5 where多条件查询

    引用 : https://blog.csdn.net/haibo0668/article/details/78203170/

  7. Docker 零碎

    Delete none tag docker image: $ docker stop $(docker ps -a | grep "Exited" | awk '{print $ ...

  8. 如何设计APP版本号?

    示例: 2.14.21 (主版本号.次版本号.补丁号) 我们可以这样设计,软件包的版本号以英文句号分隔的三个数字来定义,分别代表主版本号.次版本号和补丁号.如果只是修复了错误,没有添加任何功能,也不会 ...

  9. Python内部参数中对外部实参的影响

    无论函数传递的参数的可变还是不可变,只要针对参数使用赋值语句,会在函数内部修改局部变量的引用,不会影响到外部变量的引用,而如果传递的参数是可变类型,在函数内部使用方法修改了数据的内容,同样会影响到外部 ...

  10. windows 下安装beego

    好久没写博客了,最近忙于一些杂事,看见有几个博友留言了,未能及时回复,稍后晚点回复诸位博友.不多说了,windows安装beego(请先确保git环境已安装并设置了git环境变量.这个简单网上很多教程 ...