Hibernate为何不使用H2数据库的序列?
根据你提供的配置信息,我整理了清晰的代码示例和关键注意点,帮你确认Hibernate序列主键的正确配置:
环境与前置配置
- 使用框架/数据库版本:
- Hibernate 5.2.15
- H2数据库 1.4.197
- 已在H2中创建的序列语句:
CREATE SEQUENCE SEQ_PRIMARYKEY START WITH 1 INCREMENT BY 1;
Payment实体类完整配置示例
@Entity @Table(name="Payment", uniqueConstraints={@UniqueConstraint(columnNames={"ID"})}) public class Payment { @Id @SequenceGenerator( name = "seq_PK", sequenceName = "SEQ_PRIMARYKEY", allocationSize = 1 // 关键:和H2序列的INCREMENT BY保持一致,避免主键跳号 ) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_PK") @Column(name = "ID", nullable = false, length = 11) private Integer id; // 这里可以添加其他实体属性,比如: // private String paymentMethod; // private BigDecimal amount; // 构造方法、Getter/Setter方法请自行补充 }
关键注意事项
- 避免主键跳号问题:Hibernate默认的
@SequenceGenerator的allocationSize是50,但你的H2序列步长是1,必须显式设置allocationSize=1,否则会出现主键值跳号(比如1、51、101...)的情况。 - 冗余约束清理:
@Column中的unique=true可以省略,因为@Id注解已经隐含了主键的唯一性和非空性,同时@Table上的@UniqueConstraint(columnNames={"ID"})也是冗余的,保留@Id和@Column(nullable=false)就足够保证主键的约束要求。
内容的提问来源于stack exchange,提问作者Mckunz
相关产品推荐
相关产品推荐

