JPA主键策略

时间:2021-11-21 03:22:50

JPA 自带的主键策略有 4 种,在枚举 javax.persistence.GenerationType 中,分别是:TABLE、SEQUENCE、IDENTITY、AUTO。

TABLE:
通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。不同的JPA实现商生成的表名是不同的,如OpenJPA生成openjpa_sequence_table表,Hibernate生成一个hibernate_sequences表,而TopLink则生成sequence表。这些表都具有一个序列名和对应值两个字段,如SEQ_NAME和SEQ_COUNT。

SEQUENCE
表示使用数据库的序列为新增加的实体对象赋唯一值。这种情况下需要数据库提供对序列的支持常用的数据库中,Oracle支持,MySQL不支持这种方式。

IDENTITY
JPA 容器将使用数据库的自增长字段为新增加的实体对象赋唯一值。这种情况下需要数据库提供对自增长字段的支持,SQL Server、MySQL、DB2、Derby等支持。数据库在insert时分配标识值。Oracle不支持这种方式。

AUTO
由JPA自动生成,默认,委托JPA实现负责产生字段值。JPA会自动选择一个最适合底层数据库的主键生成策略。如MySQL会自动对应auto increment。这个是默认选项,即如果只写@GeneratedValue,等价于@GeneratedValue(strategy=GenerationType.AUTO)。

如果使用Hibernate对JPA的实现,可以使用Hibernate对主键生成策略的扩展,通过Hibernate的@GenericGenerator实现。
示例:

1
2
3
4
5
6
7
@Id
//用generator属性指定要使用的策略生成器。
@GeneratedValue(generator = "system-uuid")
//声明一个策略通用生成器,name为”system-uuid”,策略strategy为”uuid”。
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name="uuid", length=32)
private String uuid;