You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JPA按所有实体总数生成主键而非单类实体单独计数

问题成因
  • JPA中@GeneratedValue注解默认使用GenerationType.AUTO主键生成策略,Hibernate等主流JPA实现会默认创建一个全局共享的序列/计数器为所有实体分配主键值,新增任何实体都会消耗同一个计数池的序号,因此会出现不同实体的主键连续递增的现象。
解决方案

要实现每个实体独立生成主键计数,可选择以下两种配置方式:

方案1:使用IDENTITY生成策略(推荐)

该方案依赖数据库表级别的自增列特性,每个表的自增计数独立,配置最简单:
分别修改两个实体的主键注解配置:

@Entity
public class Loan {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    // 其余字段保持不变
}
@Entity
public class Payment {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // 其余字段保持不变
}

提示:MySQL、PostgreSQL、SQL Server等主流关系型数据库都支持IDENTITY策略。

方案2:为每个实体单独配置专属序列

如果业务场景要求使用序列而非自增列,可以为每个实体定义独立的序列生成器:

@Entity
// 定义Loan专属序列
@SequenceGenerator(name = "loan_seq_generator", sequenceName = "loan_seq", allocationSize = 1)
public class Loan {
    
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "loan_seq_generator")
    @Column(name = "id", nullable = false)
    private Long id;

    // 其余字段保持不变
}
@Entity
// 定义Payment专属序列
@SequenceGenerator(name = "payment_seq_generator", sequenceName = "payment_seq", allocationSize = 1)
public class Payment {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "payment_seq_generator")
    private Long id;

    // 其余字段保持不变
}

内容的提问来源于stack exchange,提问作者rational-agent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:45:05