Quarkus+Hibernate插入PostgreSQL时主键重复问题求助
主键重复问题解决思路
检查并调整主键生成策略:如果当前用的是
IDENTITY策略,Azure云数据库服务在容器重启、连接复用场景下,容易出现Hibernate缓存的主键值与数据库实际自增序列不同步的问题。建议切换为SEQUENCE策略,明确绑定数据库序列,同时设置allocationSize=1避免预分配主键值,示例配置:@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "your_entity_seq") @SequenceGenerator(name = "your_entity_seq", sequenceName = "your_entity_id_seq", allocationSize = 1) private Long id;验证连接池会话重置配置:Quarkus默认的Agroal连接池如果未正确重置连接会话状态,可能导致Hibernate主键生成器的状态异常。在
application.properties中添加以下配置,确保连接回收时重置会话:quarkus.datasource.jdbc.reset-connection=true同时合理调整连接池大小,避免连接长期占用导致状态不一致。
排查多实例部署冲突:如果Azure应用服务是多实例运行,禁止使用
TABLE类型的主键生成策略——这种客户端生成方式会导致多实例同时生成重复主键。必须依赖数据库级别的序列或自增机制,确保主键生成的全局唯一性。对齐数据库序列与Hibernate配置:若已使用
SEQUENCE策略,检查数据库中对应序列的INCREMENT BY值,必须与Hibernate@SequenceGenerator中的allocationSize完全一致。比如数据库序列设置INCREMENT BY 1,Hibernate的allocationSize也需设为1,否则会出现主键范围不匹配的重复问题。禁用Hibernate主键本地缓存:通过配置强制Hibernate每次生成主键都直接从数据库获取最新值,避免本地缓存过期或多实例缓存不一致:
hibernate.id.new_generator_mappings=true hibernate.id.optimizer.pooled.preferred=none
内容的提问来源于stack exchange,提问作者phe
相关产品推荐
相关产品推荐

