JPA中主键生成策略
通过annotation(注解)来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的**@id和@GeneratedValue**都是JPA的标准用法。
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO。
1.IDENTITY
-
具体说明如下:
IDENTITY:主键由数据库自动生成(主要是自动增长型)使用数据库的自增策略:Mysql**(auto_increment)**
SqlServer (IDENTITY)
适用于:Mysql、SQLServer
-
用法:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long custId;
2.SEQUENCE
-
具体说明如下:
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。使用于Oracle数据库,Oracle数据库没有自增的设置,需要序列完成自增!
-
用法:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq")
@SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment",initialValue = 0,allocationSize = 1)
@Column(name="p_id")
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;
}
3.AUTO
- 具体说明如下:
AUTO:主键由程序控制 - 用法:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long custId;
4.TABLE(用的比较少)
- 具体说明如下:
将当前主键的值单独保存到一个数据库的表中,主键的值每次都是从指定的表中查询来获得 这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题。 - 用法:
//使用table生成主键
@TableGenerator(name="ID_GENERATOR",
table="JPA_ID_GENERATORS",
pkColumnName="PK_NAME",
pkColumnValue="CUSTOMER_ID",
valueColumnName="PK_VALUE",
allocationSize=100
)
@GeneratedValue(strategy=GenerationType.TABLE,generator="ID_GENERATOR")
@Id
private Long custId;
其中:
1、name 属性表示该主键生成策略的名称,它被引用在@GeneratedValue中设置的generator 值中
2、table 属性表示表生成策略所持久化的表名
3、pkColumnName 属性的值表示在持久化表中,该主键生成策略所对应键值的名称
4、valueColumnName 属性的值表示在持久化表中,该主键当前所生成的值,它的值将会随着每次创建累加
5、pkColumnValue 属性的值表示在持久化表中,该生成策略所对应的主键
6、allocationSize 表示每次主键值增加的大小, 默认值为 50
关系图: