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