码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2016-05-12 23:31:06      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

内部执行过程

技术分享

主键生成器

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语句

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

标签:

原文地址:http://blog.csdn.net/qq_28483283/article/details/51345284

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!