Hibernate 中持久化类:
1、什么是持久化类:
- 持久化:将内存中的一个对象持久化到数据库中,hibernate就是用来持久化的框架;
- 持久化类:一个java文件和数据库表建立了映射关系,那么这个类在hibernate中就称为持久化类。简单的说持久化类=Java类+映射文件;
2、持久化类的编写规则:
- 对持久化类提供一个无参数的构造函数;(hibernate需要通过反射来生成对象的实例)
- 属性私有化,提供公有的get和set方法;(hibernate 要通过该方法来获取和设置对象的值)
- 对持久化类提供一个唯一标识OID与数据库主键对应;(Java中通过对象的地址来区分是否是同一个对象,数据库中通过OID来区分是否是同一条记录,在hibernate中通过对象的OID来区分是否是同一个对象)
- 持久化类中尽量使用包装类类型; (因为基本数据类型默认值是0,0会有歧义,例如该项是没有值还是值为0,而包装类类型默认值 是null,则不存在歧义)
- 持久化类不要用finall修饰; (因为延迟加载本来就是hibernate的一种优化手段,返回的是一个代理对象(javassist可以对没有实现接口的类产生代理,jdk动态代理只能对实现了接口的类进行代理,javassist使用了非常底层的字节码增强技术,继承持久化类来产生代理对象的,如果用final修饰则该类不能被继承,则不会延迟加载,hibernate的get方法和load方法作用会完全相同)
3、持久化类的三种状态
- 瞬时态:这种对象没有唯一的标识OID,没有被session管理;
- 持久态:有唯一的标识OID,且被session管理;(持久态的对象会自动更新到数据库中)
- 脱管态:有唯一的标识OID,但是不被session管理;
例如:Student stu=new Student(); stu处于瞬时态
stu.setId("1");
session.save(stu); 此时stu处于持久态
tx.commit();
session.close(); 此时stu处于托管态
Hibernate 的主键生成策略
1、主键的分类:
- 自然主键:主键的本身就是表中的一个字段;
- 代理主键:主键本身不是表中的一个字段;
2、主键生成策略:
- increment: hibernate提供的自增长机制,适用于short,int,long类型的主键,在单线程中使用;(原理:select max(id) from 表作为下一条记录的主键)
- identity: 适用于short,int,long类型的主键,使用的是数据库底层的自增长机制,适用于有自增长机制的数据库(Mysql),Oracle没有自增长;
- sequence: 适用于short,int,long类型的主键,采用的是序列的方式;(Oracle支持序列)
- uuid: 适用于字符串类型的主键,它是由hibernate中随机生成的字符串主键;
- native: 本地策略;可以在identity和sequence之间自由切换;
- assigned: hibernate放弃外键的管理,需要手动编写程序或用户自己设置;
- foreign: 外部的。一对一的关联映射下使用;