Hibernate入门(二)之hibernate的内部执行过程,主键生成器,对象的状态

来源:互联网 发布:mac pro怎么强制关机 编辑:程序博客网 时间:2024/06/05 16:20

内部执行过程

这里写图片描述

主键生成器

Identity(常用)

1、表必须支持自动增长机制2、数据库生成主键3、不需要在程序中设置主键

Assigned

必须通过程序的方式给值才可以person.setId(xxx);一般用于开发的时候测试使用

Increment(常用)

1、如果选择该主键的生成方式,则必须是数字类型2、先获取主键的最大值,在最大值的基础上加1,形成新的主键3、效率比较低,因为这种方式会先select表中最大的主键值4、主键的生成是由hibernate内部实现的

native

会根据不同的数据库选择不用的主键生成策略

Uuid

1、主键必须是varchar类型2、主键是由hibernate内部生成的3、在持久化类中必须是String类型4 自动生成,无需给值

映射文件中属性的类型

在映射文件中可以分为两种类型:

    string或者是java.lang.string,两种类型都可以使用,但是如果使用string类型的话,在映射到数据库的时候会先重string映射到java.lang.string类型,然后在映射到varchar类型,所以效率会相对比较低,所以推荐使用java.lang.string,    以此类推,比如date类型对应java.util.Date类型然后对应数据库中的DATE,TIME,TIMESTAMP类型

对象的三种状态

三种状态图解

这里写图片描述

说明:

1、把1,2,3步这样的对象称为临时状态的对象
2、临时状态的对象没有和hibernate发生交互
3、当执行第四步的时候,pereson对象和hibernate容器发生了交互
如果主键的生成机制为increment,这个时候会发出
Select max(pid) 查找主键的最大值
如果主键的生成机制为identity,则会发出insert语句
4、把第四部完成以后的对象称为持久化对象,因为和hibernate发生交互了
5、当执行第5步,完成事务提交,这个时候hibernate中的session并没有关闭,所以该对象还是持久化对象,在数据库里有对应的值了
6、当执行第6步的时候,session关闭了,该对象变成脱管对象
脱离hibernate管理了

对象状态转换图解

这里写图片描述

成为持久化状态的方法

GET方法

Pperson person=person.get(person.class,1L);
这是person这个对象的状态是持久化状态。

update方法

这里写图片描述

save方法

为什么要成为持久化状态的对象

一个对象必须成为持久化对象,在事务提交的时候,hibernate才能对该对象进行操作

图解

这里写图片描述

将持久化状态对象从hibernate容器中去除

Evict方法

这里写图片描述

说明:evict方法可以把一个对象从hibernate容器中去除掉
当事务提交的时候,并没有发出update语句

clear方法

这里写图片描述

说明:session.clear方法清空了hibernate内部的对象

综合例子

这里写图片描述

说明:

      在事务提交的时候,hibernate会检查持久化对象,如果该对象的id还没有值,则会发出insert语句,如果该对象的id有值了,则再会检查快照,如果和快照不一样,则发出update语句,如果和快照一样,则什么都不做。      所以上面的例子中person虽然是持久化对象,但是快照中的值没有变,则不会发出update语句,person4被evict方法清理出了hibernate容易,变成了托管状态,person早数据库中没有id值,所以发出insert语句,person有id值,但是值发生了改变,所以发出update语句
0 0
原创粉丝点击