黑马程序员:三大框架11天笔记全之hibernate-day06笔记

  • 格式:doc
  • 大小:574.55 KB
  • 文档页数:21

下载文档原格式

  / 21
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

黑马程序员:三大框架hibernate-day06笔记

第1章Hibernate持久化类与主键生成策略

1.1Hibernate持久化类

什么是持久化类?

Persistent Object (PO)

PO=POJO+hbm映射配置

对于hibernate中的PO编写规则:

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

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

3.在PO类必须提供一个标识属性,让它与数据库中的主键对应,我们管这个属性叫

OID

4.PO类中的属性尽量使用基本数据类型的包装类.

Int-→Integer double--→Double float-→Float

5.PO类它不能使用final修饰符

OID作用:

OID指的是与数据库中表的主键对应的属性。

Hibernate框架它是通过OID来区分不同的PO对象,如果在内存中有两个相同

的OID对象,那么hibernate认为它们是同一个对象。

为什么PO类属性它要使用包装类型?

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

PO类不可以使用final修饰?(hibernate中的get/load方法的区别)

Get/load方法它们都是根据id去查询对象。

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

load它得到的是持久化类开的代理类型对象(子类对象)。它采用了一种延迟

策略来查询数据。

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

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

ObjectNotFoundException.

1.2Hibernate主键生成策略

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

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

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

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

第2章Hibernate持久化对象状态

2.1持久化对象三种状态

有三种:

1.瞬时态:也叫做临时态或自由态,它一般指我们new出来的对象,它不存在OID,

与hibernate session无关联,在数据库中也无记录。它使用完成后,会被jvm直接回收掉,它只是用于信息携带。

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

2.持久态:在hibernate session管理范围内,它具有持久化标识OID它的特点,在

事务未提交前一直是持久态,当它发生改变时,hibernate是可以检测到的。

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

3.托管态:也叫做游离态或离线态,它是指持久态对象失去了与session的关联,托

管态对象它存在OID,在数据库中有可能存在,也有可能不存在。

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

2.2持久化类三种状态切换

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

1.是否有OID

2.判断是否与session关联

1.瞬时态(new 出来的)

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

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

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

持久-------→瞬时delete() 被删除后持久化对象不在建议使用持久-----→脱管注意:session它的缓存就是所说的一级缓存

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

clear(清空一级缓存)

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

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

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

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

第3章Hibernate一级缓存

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

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

在session中定义了一系列的集合来存储数据,它们构成session缓存。

只要session没有关闭,它就会一直存在。

当我们通过hibernate中的session提供的一些API例如save get update等进行操作时,就会将持久化对象保存到session中,当下一次在去查询缓存中具有的对象(OID值来判断),

就不会去从数据库查询,而是直接从缓存中获取。

Hibernate的一级缓存存在的目的就是为了减少对数据库访问。

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

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

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

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

3.3一级缓存常用API

一级缓存特点:

1.当我们通过session的save,update saveOrupdate进行操作时,如果一级缓存中

没有对象,会将这些对象从数据库中查询到,存储到一级缓存。

2.当我们通过session的load,get,Query的list等方法进行操作时,会先判断一级

缓存中是否存在,如果没有才会从数据库获取,并且将查询的数据存储到一级缓存中。

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

clear 清空一级缓存.

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

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