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.
相关产品推荐
相关产品推荐

