内部执行过程
主键生成器
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语句
时间: 2024-10-13 01:43:18