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

Quarkus测试添加import.sql后报EntityExistsException问题求助

问题根源

PanacheEntity默认使用SEQUENCE策略生成ID,对应的数据库序列(通常是hibernate_sequence)初始值为1。当你通过import.sql手动插入ID=1的记录后,序列的当前值并未更新,导致新增实体时Hibernate仍然生成ID=1,与已存在的记录冲突,抛出EntityExistsException。

解决方案

方案1:调整初始数据的ID值

直接使用大于序列初始值的ID插入初始数据,避免和自动生成的ID重叠。比如从100开始:

-- PUBLISHERS
INSERT INTO t_publishers (id, name, created_date) VALUES
(100, 'Programming', '2023-05-23T15:40:00.592040Z'),

方案2:手动更新序列值

在import.sql末尾添加更新序列的语句,使序列的当前值比手动插入的最大ID大1,确保自动生成的ID不会冲突:

  • 针对H2数据库(Quarkus测试默认):
    ALTER SEQUENCE hibernate_sequence RESTART WITH 2;
    
  • 针对PostgreSQL:
    SELECT setval('hibernate_sequence', 2);
    
  • 针对MySQL(若使用序列策略):
    ALTER TABLE hibernate_sequence AUTO_INCREMENT = 2;
    

方案3:自定义ID生成策略

如果需要更适配手动插入场景,可以将ID生成策略改为IDENTITY(数据库自增),这样数据库会自动管理ID的生成,跳过已手动插入的ID:

@Entity
@Table(name = "t_publishers")
public class Publisher extends PanacheEntityBase {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;
    public String name;
    public LocalDateTime createdDate;

    // 构造方法
    public Publisher() {}
    public Publisher(String name) {
        this.name = name;
        this.createdDate = LocalDateTime.now();
    }
}

使用PanacheEntityBase替代PanacheEntity,可以保留Panache的所有CRUD方法,同时自定义ID策略。


内容的提问来源于stack exchange,提问作者Jan D.M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:34:58