Jpa即hibernate的主键生成策略

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2019/09/jpa-ji-hibernate-de.html

在jpa中,定义主键如下:

@Entity
public class Person {

    @Id
    // 声明一个策略通用生成器
    @GenericGenerator(name = "inc", strategy ="increment")
    // 用generator属性指定要使用的策略生成器。
    @GeneratedValue(generator = "inc")
    private long id;
    private String name;

使用一个@Id注解就可以定义一个主键,但主键生成的策略定义却有很多方式:

Jpa的@GeneratedValue直接指定主键策略

使用 Jpa的@GeneratedValue直接指定主键策略 ,如下:

@GeneratedValue(strategy = GenerationType.AUTO)

其中strategy是一个枚举类GenerationType,有如下四种值:

AUTO 持久化层程序会自动选择一个合适的主键生成策略,策略与具体的数据库有关
IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式
SEQUENCE 通过数据库的序列产生主键, MYSQL  不支持
TABLE 提供特定的数据库产生主键, 该方式更有利于数据库的移植

eg:AUTO 类型生成的主键,在mysql中需要程序指定;但在PostgreSQL中,会自动创建一个序列,从序列中获取主键。

Jpa的@GenericGenerator使用主键生成策略

通过以下两步可以指定:

  1. @GenericGenerator声明一个主键生成策略
  2. @GeneratedValue 使用这个策略

示例如下:

    // 声明一个策略通用生成器
    @GenericGenerator(name = "inc", strategy ="increment")
    // 用generator属性指定要使用的策略生成器。
    @GeneratedValue(generator = "inc")
    private long id;

其中jpa默认的主键生成策略以及其对应的类如下:

"uuid2", UUIDGenerator.class
"guid", GUIDGenerator.class
"uuid", UUIDHexGenerator.class
"uuid.hex", UUIDHexGenerator.class
"assigned", Assigned.class
"identity", IdentityGenerator.class
"select", SelectGenerator.class
"sequence", SequenceStyleGenerator.class
"seqhilo", SequenceHiLoGenerator.class
"increment", IncrementGenerator.class
"foreign", ForeignGenerator.class
"sequence-identity", SequenceIdentityGenerator.class
"enhanced-sequence", SequenceStyleGenerator.class
"enhanced-table", TableGenerator.class

发表评论