【问题标题】:Why and how hibernate_sequence is using for id generatior为什么以及如何将 hibernate_sequence 用于 id 生成器
【发布时间】:2017-01-05 00:29:16
【问题描述】:

我在为 JHipster 生成的实体生成 ID 时遇到问题:

  1. H2 数据库上的开发环境
  2. Postgres 上的生产环境
  3. 我有一个实体“station”,其中包含两个字段“id”和“name”
  4. 创建一个 liquibase 脚本,在“站”表中导入字典,例如 INSERT INTO station (name) VALUES ('Adygeya') 没有 ID 定义
  5. 尝试在开发环境中添加工作站 - 好的
  6. 尝试在 prod 上添加站 - Hibernate 尝试添加具有重复 ID 的新站

为什么?

我的研究表明,仅在初始方案 jhipster 中为 postgres 和 oracle 创建了一个新序列“hibernate_sequence”,用于创建新实体。

所以我通过为我的实体 ID 生成规则添加特定的序列名称来解决这个错误的行为

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "station_gen")
@SequenceGenerator(name = "station_gen", sequenceName = "station_id_seq")
private Long id;

现在我只有 3 个问题:

  1. 为什么 JHipster 对 postgres 和 oracle 的所有表使用一个序列?
  2. 在哪里配置?
  3. 我做错了什么?

【问题讨论】:

  • JHipster 的哪个版本?我认为这是 spring-data 或 Hibernate 中的默认策略。对所有表仅使用一个序列并不能解释重复键问题。我有相同的设置,但没有遇到它。
  • 是的,这是默认的 Hibernate 策略。
  • @GaëlMarziou JHipster v. 3.9.1
  • @GaëlMarziou 第 4 项中问题的现实。我直接通过 SQL 在表中添加具有自己序列的新对象。例如 3 次。在本地序列中,它将是 4 - nextval,对于 hibernate_sequence,它将是 1。一旦我将使用 hibernate 创建新对象,它将是重复的。
  • @JulienDubois 你能建议如何改变这种行为吗?

标签: postgresql hibernate jhipster


【解决方案1】:

将在@GaëlMarziou 和@Julien Dubois 的帮助下找到我的答案。

这是因为 Hibernate hilo 算法与 GenerationType.AUTO 的历史和默认行为。 MySQL 不支持序列,所以 JHipster 需要使用这种愚蠢的算法

JHipster 团队找到了可以解决我的问题的正确解决方案。解决方案是对所有数据库使用 GenerationType.SEQUENCE,但对 MySql 使用 GenerationType.IDENTITY。此提交中的所有详细信息https://github.com/jhipster/generator-jhipster/commit/4516b4ff4d49a96a75fd963b0c7667f198bd9b79

这样我现在也将配置我的实体。

【讨论】:

    猜你喜欢
    • 2018-04-15
    • 2017-05-18
    • 2018-01-22
    • 2017-12-03
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多