hibernate_sequence为什么以及如何用于id generatior

时间:2017-01-05 00:29:16

标签: postgresql hibernate jhipster

我遇到了JHipster生成的实体ID生成问题:

  1. H2数据库的开发环境
  2. Postgres的产品环境
  3. 我有一个实体" station"有两个字段" id"和"名称"
  4. 创建一个liquibase脚本,用于在" station"中导入字典。表喜欢 没有ID定义的INSERT INTO station (name) VALUES ('Adygeya')
  5. 尝试在开发环境中添加电台 - 确定
  6. 尝试在prod上添加电台 - Hibernate尝试添加具有重复ID的新电台
  7. 为什么?

    我的研究表明,只有postgres和oracle在初始方案中jhipster创造了一个新的sequince" 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的所有表使用一个sequince?
    2. 它在哪里配置?
    3. 我做错了什么?

1 个答案:

答案 0 :(得分: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

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