第三章 映射对象标识符

目录

 

第一节:Hibernate 用对象标识符(OID)来区分对象

第二节:Hibernate 对象标识符生成策略

前言:

(1)理解Hibernate 用对象标识符(OID)来区分对象

  (2) Hibernate 对象标识符生成策略:


第一节: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其中一种作为主键生成方式;

 

 

 

发布了39 篇原创文章 · 获赞 16 · 访问量 3137

猜你喜欢

转载自blog.csdn.net/HDZ1821/article/details/104425311