# 主键生成器
# 主键生成策略声明
使用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设置无意义
# 主键自动设置条件设置
默认情况下,声明了主键生成策略,如果插入数据时实体对象已设置了id值,则不会再调用生成器生成并设置ID值。
如果你需要在任何情况下都通过主键生成策略生成并设置ID值,则在主键属性上添加声明@IgnoreGenIdIfPresend(false)
public class User {
@SnowflakeId
@IgnoreGenIdIfPresend(false)
private Long id;
}
@IgnoreGenIdIfPresend可以直接声明在实体类的ID属性上,或ID属性的其它注解的类注解上,或ID属性上的注释的属性值,或ID属性上的注释。