jpa主键生成策略

1 @GeneratedValue

这个注解的作用就是标识实体的唯一主键,且提供主键生成策略。

有两个属性 strategy 和 generator

generator属性是一个字符串,申明了主键生成器的名称 对应于同名的@SequenceGenerator

2 @TableGenerator

strategy属性:提供四种值

1
2
3
4
5
6
7
8
9
-AUTO 主键由程序控制, 是默认选项 ,不设置就是这个

-IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式

-SEQUENCE 通过数据库的序列产生主键, MYSQL 不支持

-Table 提供特定的数据库产生主键, 该方式更有利于数据库的移植

如果希望主键有程序手动指定即在生成insert语句时,添加id这个字段。那么不设置 @GeneratedValue即可

3 @javax.persistence.SequenceGenerator

如果实体标识的自动生策略是 GenerationType.TABLE,开发者需要为实体标识字段提供 TableGenerator 注释,它的参数描述了使用数据库表生成实体标识的具体细节。该注释支持下列属性:

属性 说明
name 该属性是必须设置的属性,它表示了 TableGenerator注释在 OpenJPA 容器中的唯一名称,将会被 GeneratedValue注释的 generator属性所使用。将实体标识的自动生成委托给数据库表时,实体标识字段的 GeneratedValue注释的 generator属性的值必须和某个 TableGenerator注释的 name属性值保持一致。
table 该属性设置的是生成序列号的表的名称。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认的表名 OPENJPA_SEQUENCES_TABLE。
schema 该属性设置的是生成序列号的表的 schema。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会默认使用当前数据库用户对应的 schema。
catalog 该属性设置的是生成序列号的表的 catalog。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认当前数据库用户对应的 catalog。
pkColumnName 该属性设置的是生成序列号的表中的主键字段的名称,该字段将保存代表每个实体对应的标识值对应的特征字符串。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 ID。
valueColumnName 该属性设置的是生成序列号的表中记录实体对应标识最大值的字段的名称。该属性并不是必须设置的属性,如果开发者没有为该 属性设置值,OpenJPA 容器将会使用默认值 SEQUENCE_VALUE。
pkColumnValue 该属性设置的是生成序列号的表中的主键字段的特征字符串值 ( 比如 customID ),该字段将保存代表每个实体对应的标识值对应的特征字符串。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 DEFAULT。可以为多个实体设置相同的 pkColumnValue属性值,这些实体标识的生成将通过同一列的值的递增来实现。
initialValue 该属性设置的是生成序列号的表实体标识的初始值。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 0 。
allocationSize 为了降低标识生成时频繁操作数据库造成 的性能上的影响,实体标识生成的时候会一次性的获取多个实体标识,该属性设置的就是一次性获取实体标识的数目。该属性并不是必须设置的属性,如果开发者没有为该属性设置值,OpenJPA 容器将会使用默认值 50 。

4 @GenericGenerator

自定义主键生成策略

实现IdentifierGenerator 接口的generate方法

然后在 @GenericGenerator 中的strategy 填写类位置(com.ss.类名)

5 常用的主键生成配置

5.1 主键自增

1
2
3
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

5.2 uuid

1
2
3
@Id
@GenericGenerator(name = "uuid",strategy = "uuid")
@GeneratedValue(generator = "uuid")

5.3 雪花ID

新建自定义主键生成策略类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.ss.demo.db_demo.dao.config;


import cn.hutool.core.lang.Snowflake;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;

import java.io.Serializable;

/**
* 雪花id 生成策略
* @author xia17
* @version 1.0
* @date 2019/12/14 13:48
*/
public class SnowFlakeIdGenerator implements IdentifierGenerator {

public static final Snowflake SNOW_FLAKE = new Snowflake(1,1);

@Override
public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException {
return SNOW_FLAKE.nextId();
}
}

在实体类中指定生成策略

1
2
3
@Id
@GenericGenerator(name = "snowFlake",strategy = "com.ss.demo.db_demo.dao.config.SnowFlakeIdGenerator")
@GeneratedValue(generator = "snowFlake")