JPA(五) 主键生成策略

1 JPA 中四种主键生成策略

1.1 IDENTITY: 主键由数据库自动生成 (主要是自动增长型)

//用法:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long custId;

1.2 SEQUENCE :根据底层数据库的序列来生成主键,条件是数据库支持序列。

用法:
@Id
@GeneratedValue(strategy  =
GenerationType.SEQUENCE,generator="payablemoney_seq")
@SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment")
private Long custId;
//@SequenceGenerator 源码中的定义
@Target({TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface SequenceGenerator {
    //表示该表主键生成策略的名称,它被引用在@GeneratedValue 中设置的“generator”值中
    String name();
    //属性表示生成策略用到的数据库序列名称。
    String sequenceName() default "";
    //表示主键初识值,默认为 0
    int initialValue() default 0;
    //表示每次主键值增加的大小,例如设置 1,则表示每次插入新记录后自动加 1,默认为 50
    int allocationSize() default 50;
}

1.3 TABLE 使用特定的数据表格来保存主键

用法:
@Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator="payablemoney_gen")
    @TableGenerator(name = "pk_gen",
        table="tb_generator",
        pkColumnName="gen_name",
        valueColumnName="gen_value",
        pkColumnValue="PAYABLEMOENY_PK",
        allocationSize=1
    )
private Long custId;
//@TableGenerator 的定义:
@Target({TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface TableGenerator {
    //表示该表主键生成策略的名称,它被引用在@GeneratedValue 中设置的“generator”值中
    String name();
    //表示表生成策略所持久化的表名,例如,这里表使用的是数据库中的“tb_generator”。
    String table() default "";
    //catalog 和 schema 具体指定表所在的目录名或是数据库名
    String catalog() default "";
    String schema() default "";
    //属性的值表示在持久化表中,该主键生成策略所对应键值的名称。例如在“tb_generator”中将
    “gen_name”作为主键的键值
    String pkColumnName() default "";
    //属性的值表示在持久化表中,该主键当前所生成的值,它的值将会随着每次创建累加。例如,在
    “tb_generator”中将“gen_value”作为主键的值
    String valueColumnName() default "";
    //属性的值表示在持久化表中,该生成策略所对应的主键。例如在“tb_generator”表中,将
    “gen_name”的值为“CUSTOMER_PK”。
    String pkColumnValue() default "";
    //表示主键初识值,默认为 0。
    int initialValue() default 0;
    //表示每次主键值增加的大小,例如设置成 1,则表示每次创建新记录后自动加 1,默认为 50。
    int allocationSize() default 50;
    UniqueConstraint[] uniqueConstraints() default {};
}
//这里应用表 tb_generator,定义为 :
CREATE TABLE tb_generator (
id NUMBER NOT NULL,
gen_name VARCHAR2(255) NOT NULL,
gen_value NUMBER NOT NULL,
PRIMARY KEY(id)
)

1.4 AUTO: :是 由以上三个选择一个(默认是 TABLE )

auto 策略是 JPA 默认的策略,在 hibernate 的代码 GenerationType.AUTO 进行定义。使用 AUTO 策
略就是将主键生成的策略交给持久化引擎 (persistence engine) 来决定,由它自己从 Table 策略,
Sequence 策略和 Identity 策略三种策略中选择最合适的。

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long custId;

2 使用 hibernate 中的主键生成规则

在讲解 Hibernate 的主键生成策略之前,先来了解两个概念,即自然主键和代理主键,具体如下:
自然主键:
把具有业务含义的字段作为主键,称之为自然主键。例如在 customer 表中,如果把 name 字段作为主
键,其前提条件必须是:每一个客户的姓名不允许为 null,不允许客户重名,并且不允许修改客户姓名。尽管这
也是可行的,但是不能满足不断变化的业务需求,一旦出现了允许客户重名的业务需求,就必须修改数据模型,重
新定义表的主键,这给数据库的维护增加了难度。
代理主键:
把不具备业务含义的字段作为主键,称之为代理主键。该字段一般取名为“ID”,通常为整数类型,因
为整数类型比字符串类型要节省更多的数据库空间。在上面例子中,显然更合理的方式是使用代理主键。
JPA(五) 主键生成策略_第1张图片

2.2 使用方式

@Entity
@Table(name="cst_customer")
public class Customer implements Serializable {
@Id
@Column(name="cust_id")
//generator 属性用于引用@GenericGenerator 注解 name 属性的值
@GeneratedValue(generator="uuid")
//@GenericGenerator 注解是 hibernate 提供的。
//strategy 属性用于指定 hibernate 中提供的生成规则
//name 属性用于给使用的生成规则起个名称,以供 JPA 引用
@GenericGenerator(name="uuid",strategy="uuid")
private String custId;
}

你可能感兴趣的:(JPA)