【问题标题】:Incompatible sequence names between Liquibase and Hibernate JPA for PostgreSQL and H2Liquibase 和 Hibernate JPA for PostgreSQL 和 H2 之间的序列名称不兼容
【发布时间】:2012-10-20 14:44:50
【问题描述】:

我有一个使用标准 Hibernate JPA 和 Liquibase 运行的应用程序来生成数据库。我在运行时使用 H2 进行测试和使用 PostgreSQL。

我的问题是我似乎无法让这个设置很好地用于生成序列的主键。

当我有这样的实体 ID 时:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

并使用 liquibase 创建数据库,如下所示:

<column name="id" type="BIGINT" autoIncrement="true" incrementBy="1">
    <constraints nullable="false" primaryKey="true" />
</column>

它在 H2 中运行良好,但对于 PostgreSQL,Hibernate 抱怨它是:

"Missing sequence or table: hibernate_sequence"

我可以通过将 JPA @GeneratedValue 更改为以下内容来为 PostgreSQL 解决此问题:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "text_id_seq")
@SequenceGenerator(name = "text_id_seq", sequenceName = "text_id_seq", allocationSize = 1)
private Long id;

但现在 H2 序列与 Hibernate 期望的不匹配。

似乎没有任何简单的方法可以确保 Liquibase 具有特定名称的序列。我该怎么做才能让这个设置生效?

我好像正在跑步

  • liquibase.version 2.0.4
  • 休眠 4.1.7
  • postgres 驱动 9.1-901.jdbc3
  • postgres 9.2.1(至少在本地)
  • h2 1.3.168

【问题讨论】:

  • GenerationType.IDENTITY 呢?一般来说,IMO,这是 JPA 的缺点之一;所有这些逐个注释的配置使得当它需要因目标数据库而变化时很难调整。
  • 谢谢@CraigRinger,有点尴尬,我没想过要尝试。在 H2、pg 和 mysql 中工作就像一个魅力。如果 AUTO 可以跨 liquibase 和 JPA 工作会更好,但没什么大不了的。

标签: hibernate postgresql jpa h2 liquibase


【解决方案1】:

使用GenerationType.IDENTITY。这应该适用于大多数数据库。

在我看来,身份生成是 JPA 的缺点之一;根据您正在使用的数据库等设置生成选项的全局覆盖太难了。在注释中执行此操作很难以编程方式进行调整。

Hibernate 的诡异hibernate_sequence 尤其痛苦。为什么它不使用 PostgreSQL 默认序列来生成列,这超出了我的理解。

【讨论】:

    猜你喜欢
    • 2021-06-12
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2011-05-11
    • 2019-11-04
    • 1970-01-01
    相关资源
    最近更新 更多