实现方式
- 通过@GenericGenerator注解自定义主键生成策略
- 需要实现org.hibernate.id.IdentifierGenerator接口
- 根据官网例子进行改造,官网链接:https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators-GenericGenerator
引入依赖
这里使用hutool工具包里封装好的雪花算法生成id直接,需引入hutool-all依赖。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.6.2</version>
</dependency>
实体类父类
业务实体直接继承父类。
strategy 参数为GenerationType.SEQUENCE,使用序列生成id,因此使用的数据库需支持序列。
@Data
@NoArgsConstructor
@AllArgsConstructor
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
/**
* 主键id
*/
@Id
@GeneratedValue(generator = "myIdGeneratorConfig",
strategy = GenerationType.SEQUENCE)
@GenericGenerator(
name = "myIdGeneratorConfig",
strategy = "com.ozoz.misc.config.MyIdGeneratorConfig")
private Long id;
/**
* 创建时间
*/
@CreatedDate
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 更新时间
*/
@LastModifiedDate
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/**
* 删除标记 0是未删除 1是已删除
*/
private Integer deleteTag;
}
实现IdentifierGenerator
实现IdentifierGenerator,引入雪花算法生成主键id。
@Slf4j
public class MyIdGeneratorConfig 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() {
WORKER_ID = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());
log.info("当前机器的workId:{}", WORKER_ID);
}
public synchronized long snowflakeId() {
return snowflake.nextId();
}
public synchronized long snowflakeId(long workerId, long datacenterId) {
Snowflake snowflake = IdUtil.createSnowflake(workerId, datacenterId);
return snowflake.nextId();
}
@Override
public Serializable generate(SharedSessionContractImplementor session, Object object)
throws HibernateException {
return snowflakeId(WORKER_ID, DATACENTER_ID);
}
}