# 主键生成器
使用javax.persistence.GeneratedValue注解声明主键的创建方式
对于@GeneratedValue的strategy(策略)枚举,有不同的处理方式
| 策略 | 说明 |
|---|---|
| AUTO | 由generator指定一个生成器的名称 |
| IDENTITY | 由数据库自增或用户设值,等同于不声明@GeneratedValue |
| TABLE | 使用表模拟一个序列,需要同时配置@TableGenerator |
| SEQUENCE | 对于oracle这类支持序列的数据库,需要同时配置@SequenceGenerator |
# GenerationType.AUTO
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = Constants.ID_GENERATOR_SNOWFLAKE)
private Long id;
generator是com.yuehuanghun.mybatis.milu.id.IdentifierGenerator实现类的getName()获取的标识。
已内置两个分布式主键生成器:
com.yuehuanghun.mybatis.milu.id.impl.snowflake.SnowflakeIdentifierGenerator
com.yuehuanghun.mybatis.milu.id.impl.UUIDIdentifierGenerator
对于标识为Constants.ID_GENERATOR_SNOWFLAKE和Constants.ID_GENERATOR_UUID常量
在springboot中,可以快速自定义一个主键生成器
@Component
public class MyIdentifierGenerator implements IdentifierGenerator {
@Override
public Serializable generate(IdGenerateContext context) {
return xxxx;
}
@Override
public String getName() {
return "myName";
}
}
# GenerationType.TABLE
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "tableSequence")
@TableGenerator(name = "tableSequence", table = "sequence", valueColumnName = "current_seq", pkColumnName = "id", pkColumnValue = "1")
private Long id;
对应表
CREATE TABLE `sequence` (
`id` INT(10) UNSIGNED NOT NULL COMMENT 'id',
`current_seq` BIGINT(20) UNSIGNED NOT NULL,
`seq_name` VARCHAR(50) NULL DEFAULT '',
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
)
# GenerationType.SEQUENCE
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ignore")
@SequenceGenerator(sequenceName = "SEQ_STUDENT_ID", name = "ignore")
private Long id;
直接指定数据库中设定的序列表即可,@GeneratedValue中generator设置无意义