Java 如何生成主键
使用数据库自增主键
在数据库中设置主键列为自增类型(如MySQL的AUTO_INCREMENT或PostgreSQL的SERIAL)。插入数据时无需指定主键值,数据库会自动生成。
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 其他字段
}
使用UUID生成主键
通过java.util.UUID生成全局唯一标识符(UUID),适用于分布式系统。
import java.util.UUID;
@Entity
public class Product {
@Id
private String id = UUID.randomUUID().toString();
// 其他字段
}
使用Hibernate序列生成器
依赖数据库序列(如Oracle的SEQUENCE)生成主键,需配置GenerationType.SEQUENCE。
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_gen")
@SequenceGenerator(name = "seq_gen", sequenceName = "order_seq")
private Long id;
// 其他字段
}
使用时间戳或雪花算法
结合时间戳和机器标识生成唯一ID,适用于高并发场景。例如Twitter的Snowflake算法实现:
public class SnowflakeIdGenerator {
private final long twepoch = 1288834974657L;
private final long workerIdBits = 5L;
private final long datacenterIdBits = 5L;
private final long sequenceBits = 12L;
public synchronized long nextId() {
long timestamp = System.currentTimeMillis();
// 实现算法逻辑
return ((timestamp - twepoch) << 22) | (datacenterId << 17) | (workerId << 12) | sequence;
}
}
使用Redis自增主键
通过Redis的INCR命令生成递增ID,适用于高吞吐量场景。
Jedis jedis = new Jedis("localhost");
long id = jedis.incr("global:entity_id");
使用复合主键
通过@Embeddable和@EmbeddedId定义复合主键,适用于多字段联合唯一的情况。

@Embeddable
public class OrderPK implements Serializable {
private String customerId;
private String orderNumber;
}
@Entity
public class Order {
@EmbeddedId
private OrderPK id;
// 其他字段
}





