一、背景
有一天接到一个开发任务,实现简单的CRUD,实现完自测一下,看到数据库中的id,很别扭。看了一下代码,马上决定着手修改。
二、实现
原本写法:
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
- 通过@GenericGenerator注解自定义主键生成策略
- 需要实现org.hibernate.id.IdentifierGenerator接口
先引用hutool工具包(非常好用,强烈推荐):
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.0.5</version>
</dependency>
自定义:
@Slf4j
public class GeneratorConfig implements IdentifierGenerator {
/**
* 终端ID
*/
public static long WORKER_ID = 1;
/** 数据中心id */
public static long DATACENTER_ID = 1;
private Snowflake snowflake = IdUtil.createSnowflake(WORKER_ID, DATACENTER_ID);
@PostConstruct
public void init() {
//根据ip地址计算出long型的数据
WORKER_ID = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());
}
public synchronized String snowflakeId() {
return snowflake.nextIdStr();
}
@Override
public Serializable generate(SharedSessionContractImplementor session, Object object)
throws HibernateException {
return snowflakeId();
}
}
添加自定义规则后使用:
@Id
@GeneratedValue(generator = "generatorConfig", strategy = GenerationType.SEQUENCE)
@GenericGenerator(name = "generatorConfig",strategy = "cn.com.test.GeneratorConfig")
private String id;