Hibernate实体类编写规则和主键生成策略

1 Hibernate持久化类(实体类)编写规则

1.1 什么是持久化类

Hibernate是持久层的ORM映射框架,专注于数据的持久化工作。所谓的持久化,就是将内存中的数据永久地存储到关系型数据库中。而持久化类,就是一个Java类与数据库表建立了映射关系(即Java类有了一个映射文件与数据库的表建立关系),那么这个类就称为持久化类。

1.2 持久化类的编写规则

  • 持久化类需要提供无参数的构造方法。

  • 持久化类的属性需要私有,对私有的属性提供共有的get和set方法。(因为在Hibernate底层会将查询的数据进行封装)

  • 持久化类的属性要尽量使用包装类的类型。(因为包装类和基本数据类型的默认值不同,包装类的类型语义描述更清晰而基本数据类型不容易描述)

假设表中有一列学生成绩,使用int类型,如果某个学生得了0分,则int score=0;而若是某个学生缺考,又int score=0;不能准确表示该学生是否参加了考试。而使用包装类就可以清晰表达:Integer score=0表示学生得0分;Integer score=null表示学生没有参加考试。

八个基本数据类型及其对应的包装类:

基本数据类型 包装类
int Integer
char Character
boolean Boolean
float Float
double Double
short Short
long Long
byte Byte
  • 持久化类要有一个唯一的标识OID与表的主键对应。(因为Hibernate中需要通过这个唯一的标识OID区分在内存中是否是同一个持久化类。在java中通过地址区分是否是同一个对象的,在关系型数据库的表中是通过主键区分是否是同一条记录。Hibernate就是通过这个OID来进行区分的。Hibernate是不允许在内存中出现两个OID相同的持久化对象的。)
  • 持久化类尽量不要使用final进行修饰。(因为Hibernate中有延迟加载机制,这个机制中会产生代理对象,Hibernate是使用字节码的增强技术产生代理对象的,其实就是产生了当前类的一个子类对象实现的。如果使用final修饰持久化类,那么就不能产生子类,从而就不会产生代理对象,Hibernate的延迟加载策略就会失效。)

2 Hibernate主键生成策略

2.1 主键的类型

  • 自然主键
    把具有业务含义的字段作为主键,这个主键就称为自然主键。如在客户表中,把name字段作为主键,其前提条件是每一个客户的姓名不允许为null,且不允许重名,更不允许被修改。
  • 代理主键
    把不具备业务含义的字段作为主键,这个主键就称为代理主键。该字段一般取名为”ID“,通常为整数类型,因为整数类型比字符串类型要节省更多的数据库空间。

对比之下,自然主键虽然可行,但是不能满足不断变化的业务需求,一旦出现了运行客户重名的业务需求,就必须修改数据类型,重新定义表的主键,这给数据库的维护增加了难度。在这种情况下,使用代理主键的方式就更合理。

2.2 主键生成策略

❀ Hibernate要求实体类里面有一个属性作为唯一值,对应表中的主键,主键可以有不同的生成策略。❀

 <!-- native:生成表id值就是主键自动增长 -->
    <generator class="native"></generator>

Hibernate中内置的常用主键生成策略如下:

名称 描述
increment 用于long、short、或int类型,由Hibernate自动以递增的方式生成唯一标识符,每次增量1 只有当没有其他进程向同一张表中插入数据时才可以使用,不能在集群环境下使用。适用于代理主键。
identity(MySQL 采用底层数据库本身提供的主键生成标识符,条件是数据库支持自动增长数据类型(Oracle不支持自动增长,MySQL支持)。在DB2、MySQL、MS SQL Server、Sybase、和HypersonicSQL数据库中可以使用该生成器,该生成器要求在数据库中把主键定义成自增长类型。适用于代理主键。
sequence(Oracle Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列(Oracle支持序列,MySQL不支持)。适用于代理主键。
native(本地 根据底层数据库对自动生成标识符的能力来选择identity、sequence、hilo三种生成器中的一种,适合跨数据库平台开发。适用于代理主键。(native可以根据使用的数据库选择值,identity或是sequence
uuid Hibernate采用128位的UUID算法生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,其UUID被编码成一个长度为32位的十六进制字符串。这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。适用于代理主键。
assigned 由Java程序负责生成标识符,如果不指定id元素的generator属性,则默认使用该主键生成策略。适用于自然主键。

2.3 uuid生成策略演示

注意:在使用uuid生成策略时,实体类的id属性类型必须是字符串类型。

private String uid;
<generator class="uuid"></generator>

执行添加操作之后自动生成的随机的唯一的uid值:
在这里插入图片描述
生成的uid是字符串类型,同时是主键:
在这里插入图片描述

发布了30 篇原创文章 · 获赞 12 · 访问量 1271

猜你喜欢

转载自blog.csdn.net/dawn_1108/article/details/104388452