Spring Data Jpa 主键生成策略
0x00 Spring Data JPA主键生成策略
如果你用Spring Data JPA的@Entity
将一个类标注为一个实体类的话,那首先我们会定义一个id
字段,并标注其生成类型,示例如下:
1 |
|
对于@GeneratedValue
中的strategy
字段一共有四种枚举类型,如下:
1 | public enum GenerationType { |
不同数据库对四种主键生成策略的支持如下:
GenerationType | MySQL | Oracle | postgreSQL |
---|---|---|---|
TABLE | 支持 | 支持 | 支持 |
SEQUENCE | 不支持 | 支持 | 支持 |
IDENTITY | 支持 | 不支持 | 支持 |
AUTO | 支持 | 支持 | 支持 |
当然,我们也可以自定义自己的主键生成策略。
0x01 GenerationType.AUTO
如果你不对strategy
属性加以单独的设置的话,这个也是这个字段的默认值。在此生成策略下,主键的值有可能是数字也有可能是UUID,取决于你这个主键被定义成了什么类型:
1 |
|
在上述情况下,自动生成数值类型的主键,这个策略下的主键将会在这个表所属的整个数据库schema内是唯一的。
1 |
|
在此种情况下,会调用
UUIDGenerator
(≥ Hibernate 5)来生成一个UUID。
0x02 GenerationType.IDENTITY
这个就没什么好说的了,这个依靠的是数据库的AUTO_INCREMENT
,自增长的主键类型。这个主键的生成是交由数据库来做的,也是在数据库内生成的,这就需要数据库对自增长字段的支持。
0x03 GenerationType.SEQUENCE
依据底层数据库的序列来生成主键,前提是底层数据库支持序列。MySQL不支持序列,但Oracle支持。SQL中创建一个sequence的示例代码如下:
1 | CREATE SEQUENCE sequence_1 |
对于一个表,使用上述定义的sequence作为主键插入的示例代码如下:
1 | -- 示例表的构造 |
0x04 GenerationType.TABLE
使用一个特定的数据库表格来保存主键。
0x05 自定义生成策略
我们自定义一个主键生成策略,旨在实现Twitter的Snowflake算法生成分布式唯一主键。有关Snowflake算法可参考我的另一篇文章:分布式唯一id生成策略,在此不赘述。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Shaoqun Liu's Blog!