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

内部执行过程

这里写图片描述

主键生成器

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语句
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值