标签:
1、表必须支持自动增长机制
2、数据库生成主键
3、不需要在程序中设置主键
必须通过程序的方式给值才可以
person.setId(xxx);
一般用于开发的时候测试使用
1、如果选择该主键的生成方式,则必须是数字类型
2、先获取主键的最大值,在最大值的基础上加1,形成新的主键
3、效率比较低,因为这种方式会先select表中最大的主键值
4、主键的生成是由hibernate内部实现的
会根据不同的数据库选择不用的主键生成策略
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管理了
Pperson person=person.get(person.class,1L);
这是person这个对象的状态是持久化状态。
一个对象必须成为持久化对象,在事务提交的时候,hibernate才能对该对象进行操作
说明:evict方法可以把一个对象从hibernate容器中去除掉
当事务提交的时候,并没有发出update语句
说明: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