【问题标题】:Hibernate primary key constraint violationHibernate 主键约束违反
【发布时间】:2012-07-15 01:43:41
【问题描述】:

我正在尝试编写一个 SQL 脚本来将数据从某个旧表迁移到新表。 新表的主键(id)由hibernate管理,旧表的主键也是如此。 我不知道如何使用普通 SQL 为新表分配 id,所以我正在做的是从旧表中获取 id。 迁移脚本按预期工作。

在某些时候,我的应用程序尝试使用 Hibernate 将数据插入到新表中,但我得到了主键约束冲突异常。我怀疑这是因为休眠分配的键与我在迁移旧数据时提供的键发生冲突。 顺便说一句 - hibernate 被配置为为每个表分配唯一的主键。

我做错了什么? 我应该如何解决这个问题?

谢谢

【问题讨论】:

  • 您必须从旧表中获取 id 吗?如果您有新的 ID,它会破坏一些东西吗?
  • 如果有帮助的话,我不必使用旧 ID。

标签: java sql hibernate


【解决方案1】:

如果您使用具有自动增量的数据库作为主键(例如 mysql、MSSQL)键列,您必须将自动增量值设置为现有 id 的最大值(迁移后)。 如果您使用序列生成 id(例如 oracle、postgree),则必须将当前序列值从现有 id 更改为最大值(迁移后)。

【讨论】:

  • 谢谢 - 这可能会有所帮助,但我没有使用(至少不是以我知道的方式)数据库 ID 生成器。我通过以下方式使用休眠注释:@Id @GeneratedValue(strategy = GenerationType.TABLE) long id;而且我不确定它是如何工作的
【解决方案2】:

好的 - 事实证明,当将 @GeneratedValue(strategy = GenerationType.TABLE) 与 Hibernate 一起使用时,我们有 hibernate_sequences 表来跟踪我的数据库中每个表的下一个 id。所以我所要做的就是更新这个表并正确设置下一个 id - 正如之前所说的那样。

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2021-04-11
    • 2016-08-24
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2021-04-14
    相关资源
    最近更新 更多