当前位置: 首页 > 知识库问答 >
问题:

重复的键值违反了 Postgres 的唯一约束“hibernate_sequences_pkey”异常

龙逸清
2023-03-14

基于Spring Data(JPA/Hibernate)的应用程序在Postgres中持久化新实体时会增加负载,出现以下异常:org.postgresql.util.PSQLException:错误:重复键值违反唯一约束“hibernate_sequences_pkey”

id的策略定义如下:

@Id
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name = "ID")
public Long getId() {
    return id;
}

我知道这种策略对Postgres来说并不是完美的解决方案,然而这是上述例外的原因吗?

负载是使用Apache Camel route生成的,splitter在多线程上并行运行插入。

共有2个答案

洪凯定
2023-03-14

从Hibernate 4迁移到5.3.1(Wildfly 14.0.1)时,我还遇到了与“重复键值违反唯一约束”hibernate_sequences_pkey错误消息相关的问题。在调查了Hibernate 5.3.1的源代码后,我可以使用策略=GenerationType.TABLE摆脱错误(我也知道这个策略不是完美的解决方案)。主要问题出在TableGenerator类中。要解决这个问题,您应该另外使用GenericGenerator注释,例如:

@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = TableGenerator.DEF_TABLE)
@GenericGenerator(name = TableGenerator.DEF_TABLE, strategy
        = "org.hibernate.id.enhanced.TableGenerator", parameters = {
        @Parameter(name = TableGenerator.CONFIG_PREFER_SEGMENT_PER_ENTITY, value = "true")})
@Column(name="id")
private Integer id;

设置< code >表格生成器。CONFIG _ prefere _ SEGMENT _ PER _ ENTITY 参数设置为真值(因为它默认为假值,在这种情况下,Hibernate将使用hibernate_sequences表中的“默认”段名,而不是表名)。您还应该将< code > hibernate . model . generator _ name _ as _ sequence _ name 属性设置为false值,以便只有一个hibernate_sequences表,否则,Hibernate将使用生成器名称作为序列表的名称(根据https://github . com/Hibernate/Hibernate-ORM/commit/9 a 75 fa 8d 979185 b 6014 a 814 BF 3 ffd 09 e 32143939 # diff-936141 a 40957 CD 8 a 9 a 94 a 93 a 7444)另外(但不是必须的),您还可以将< code > hibernate . id . generator . stored _ last _ used 属性设置为false值(https://github . com/hibernate/hibernate-ORM/commit/9af 565510064635 DBA 7 e 48087 ab 4 e 8 f 5e f 439 f 0d更改),因为:

为了符合JPA规范,Hibernate 5.3在< code > javax . persistence . Table generator 使用的表中存储的值是最后生成的值。以前版本的Hibernate存储下一个要使用的值。

为了向后兼容,引入了一个新的设置hibernate.id.generator.stored_last_used,它提供了返回旧Hibernate行为的机会。迁移到5.3并使用@TableGenerator的现有应用html" target="_blank">程序必须将hibernate.id.generator.stored_last_used设置为false

谷梁博易
2023-03-14

经过一些测试,问题似乎确实是由策略 = 生成类型.TABLE 引起的。随着策略 = 生成类型.SEQUENCE 的更改,上面描述的重复键的问题消失了。

@Id
@SequenceGenerator(name = Consts.VEHICLE_ATTR_ID_SEQ,
        sequenceName = Consts.VEHICLE_ATTR_ID_SEQ,
        allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE,
        generator = Consts.VEHICLE_ATTR_ID_SEQ)
@Column(name = "ID", updatable = false)
public Long getId() {
    return id;
} 
 类似资料:
  • 我有一个笑话模型: 现在,当我试图迁移最后一行时,我得到了错误。基本上,我想将一个用户链接到Joke对象,因为我已经有了一个数据库,所以我希望默认值为1,这是管理员用户的id(我检查过了...).Makemigrations工作正常,但是当我尝试迁移时,我得到了这个: 我真的不明白怎么了。有什么想法吗?

  • 问题内容: 我正在跟着我先前提出的一个问题,在这个问题中,我试图寻求从愚蠢/编写不佳的mysql查询到postgresql的转换。我相信我成功了。无论如何,我正在使用从mysql数据库手动移动到postgres数据库的数据。我正在使用如下查询: 我有理由相信这很好。但是,这导致了新问题。尝试提交时,我从django收到一条错误,指出: 我已经看过这里发布的一些回复,但是我还没有找到解决我的问题的方

  • 我在django应用程序中创建了一个模型,并从pgadmin将数据填充到表中,但现在当我试图从应用程序创建记录时,它抛出了这个完整性错误: 重复的键值违反了唯一约束“packsapp_foo_pkey” 详细信息:键(id)=(4)已经存在。 这是models.py 我是否总是必须从应用程序本身插入数据? Views.py

  • 我必须交换同一表的不同行的属性。 有一列“reference_id”在 DB 中具有唯一的约束。 代码: A 级- B级- 异常跟踪:

  • 我正在使用django和精神来构建一个网站。在一次测试中,当我将新数据插入一个名为的表时,我得到了以下错误: 请注意,表中已经有另外两条 id 为 和 。因此,插入当然行不通。但是执行的 sql 不包含 字段。也就是说, 是由 postgresql 自动生成的,为什么它生成一个已经存在的 ID? 为了找出原因,我在postgresql中运行了以下命令: 因此,基本上,是,因此postgresql每

  • 卡住了,我有一个数据库,当我试图让时,它给出了这个错误,如下所示: 以下是整个错误: