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语句
时间: 2024-10-13 01:43:18

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

Hibernate入门第二课 Hibernate Tools for Eclipse Plugins安装

Hibernate入门第二课 Hibernate Tools for Eclipse Plugins安装 你们可以直接去,http://blog.csdn.net/wei_chong_chong/article/details/52979683,楼主写的挺好的. 自己心得: Hibernate装了好久都装不上去,不是安装过程出了问题,原来是下载的那些软件根本就不对,虽然都有hibertane的英文,但是具体名称要看懂啊,最好做到和视频里面一模一样.

[原创]java WEB学习笔记85:Hibernate学习之路-- -映射 一对一关系 ,基于主键方式实现

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

CLRMonitor - 跟踪CLR内部执行过程工具

CLRMonitor v1.0.1511.13 点击此处下载 软件介绍:这款软件主要用于跟踪CLR内部执行过程,定位当前程序执行的命名空间以及方法名等信息.可以迅速找到被跟踪程序的当前执行方法名.本软件理论上可以监控所有的加密或未加密的DOTNET平台程序.注意:请正确选择x86平台和x64平台软件,否则监控可能不工作. *实现跟踪CLR内部执行过程,定位当前程序执行的命名空间以及方法名等信息.*支持Windows XP/2003/Vista/7/8/10*支持对DOTNET2.0/4.0支持.

看看PHP迭代器的内部执行过程

下面我们来了解如何实现一个自定义的迭代器,然后再开始慢慢理解迭代器的内部工作原理.先来看一个官方的例子: <?php class myIterator implements Iterator { private $position = 0; private $array = array( "first_element", "second_element", "last_element", ); public function __const

Hibernate自定义主键生成器

1:Entity实体配置 2:自定义主键生成器 3:执行save 4:查看结果

Hibernate入门(二)——hibernateAPI详解

Hibernate API 详解 1.Configuration 功能:配置加载类,用于加载主配置,orm元数据加载 .创建: Configuration conf = new Configuration(); 读取指定配置文件(加载主配置文件,即我们经常创建的"hibernate.cfg.xml") 从下图中可以发现有很多关于读取方法的重载... 虽然有这么多重载,但是一般咱就用无参构造方法把,默认找到src下的hibernate.cfg.xml文件 conf.configure()

Hibernate入门篇&lt;1&gt;hibernate.cfg.xml学习小结

Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种属性,这个配置文件应该位于应用程序或Web程序的类文件夹 classes中.Hibernate配置文件支持两种形式,一种是xml格式的配置文件,另一种是Java属性文件格式的配置文件,采用"键=值"的形式.建议采用xml格式的配置文件,xml配置文件可以直接对映射文件进行配置,并由Hibernate自动加载,而properties文件则必须在程序中通过编码加载映射文件. 一)hibernate配置文件模

Hibernate入门(三)之hibernate 的session的缓存机制

session缓存 缓存的生命周期 当打开session以后,该缓存就开始了,当session关闭以后,该缓存不存在,其生命周期和session的生命周期是一样的 如何将数据存放到缓存中 get方法 session.get方法可以把一个对象放入到session的缓存中,以主键标识该对象,所以我们把这样的主键也叫oid save方法 Session.save方法可以把对象放入到缓存中 update方法 session.update方法把对象放入到了session缓存中 如何测试缓存中是否有数据 说

Hibernate笔记③--集合映射、组合映射、联合主键、查询案例

lazy 懒加载 默认为proxy ? 继承映射 discriminant column="type" type="string" ? 集合映射 生成表的语句: public class DbCreate { ????public static void main(String[] args) { ????????Configuration cfg=new Configuration().configure("/hibernate.cfg.xml"