目录
第一节:Hibernate 用对象标识符(OID)来区分对象
(1)理解Hibernate 用对象标识符(OID)来区分对象
第一节:Hibernate 用对象标识符(OID)来区分对象
第二节:Hibernate 对象标识符生成策略
主键的分类 业务主键 VS 代理主键 代理主键是不具有业务性的; 1,increment: 由hibernate管理主键,自动以递增的方式生成标识符,每次增量为1。其在每次插入前取得一个当前最大的id+1作为主键,该主键必为Integer类型。 2,identity 由底层数据库自行生成的;但此主键必设为自增长,前提是低层数据库支持自动增长字段类型。 3,sequcence: 由 Hibernate 根据底层数据库的序列来生成标识符;mysql数据库不支持,oracle数据库支持。 4,hilo: Hibernate 根据 high/low 算法来生成标识符,需额外的数据库表或字段提供高位值来源。 5,native: hibernate根据底层数据库自行选择 identity,sequence 或 hilo其中一种作为主键生成方式; |
前言:
Hibernate 用对象标识符(OID)来区分对象 类似 在数据库中用主键来区分记录。
首先复制【Hibernate02】项目,粘贴重命名为【Hibernate03】
可以把之前的项目都close掉。
比如说右键【Hibernate02】-【Close Project】
把新建立的【Hibernate03】中所有Teacher的文件都删掉:删掉之后的文件目录像这样:
当然如果忘记了删除 项目的hibernate配置文件 里面的teacher依旧会报错。
所以别忘记了删除这个:
(1)理解Hibernate 用对象标识符(OID)来区分对象
将StudentTest.java内容改为如下:
源代码:
package service;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import model.Student;
import util.HibernateUtil;
public class StudentTest {
public static void main(String[] args) {
SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
Session session=sessionFactory.openSession(); // 生成一个session
session.beginTransaction(); // 开启事务
Student s1=(Student)session.get(Student.class, Long.valueOf(1));
Student s2=(Student)session.get(Student.class, Long.valueOf(2));
Student s3=(Student)session.get(Student.class, Long.valueOf(1));
//该==表示是否指向同一对象
System.out.println(s1==s2);
System.out.println(s1==s3);
session.getTransaction().commit(); // 提交事务
session.close(); // 关闭session
//sessionFactory.close(); // 关闭session工厂
}
}
进行运行之后:
看Console我们可以发现,s3的eclipse输出sql语句,它没有输出。
这就意味着,并没有去数据库里面寻找该数据,而是去了session缓存里面找到的s3里的对象。
所以说,再回到之前的那张图,就能够很清楚明白 何为 Hibernate 用对象标识符(OID)来区分对象。
(2) Hibernate 对象标识符生成策略:
代理主键与业务主键的区别:
代理主键:就像这样1,2,3,4,……一直递增的编码一样,是没有什么实际意义的。
业务主键:比如学号,工号……等这种有实际意义的。适用于:不经常变动的属性。
进入 对象的hibernate配置文件:
更改其属性
以下所有对象标识符都适用于 代理主键:
1,increment:
由hibernate管理主键,自动以递增的方式生成标识符,每次增量为1。其在每次插入前取得一个当前最大的id+1作为主键,该主键必为Integer类型。
2,identity
由底层数据库自行生成的;但此主键必设为自增长,前提是低层数据库支持自动增长字段类型。
3,sequcence:
由 Hibernate 根据底层数据库的序列来生成标识符;mysql数据库不支持,oracle数据库支持。
4,hilo:
Hibernate 根据 high/low 算法来生成标识符,需额外的数据库表或字段提供高位值来源。
5,native:
hibernate根据底层数据库自行选择 identity,sequence 或 hilo其中一种作为主键生成方式;