对于PostgreSQL和H2,Liquibase和Hibernate JPA之间的序列名称不兼容

sto*_*set 5 postgresql hibernate jpa h2 liquibase

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

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

当我有这样的实体ID时:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
Run Code Online (Sandbox Code Playgroud)

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

<column name="id" type="BIGINT" autoIncrement="true" incrementBy="1">
    <constraints nullable="false" primaryKey="true" />
</column>
Run Code Online (Sandbox Code Playgroud)

它在H2中工作正常,但对于PostgreSQL,Hibernate抱怨它是:

"Missing sequence or table: hibernate_sequence"
Run Code Online (Sandbox Code Playgroud)

我可以通过将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;
Run Code Online (Sandbox Code Playgroud)

但是现在H2序列与Hibernate所期望的不匹配.

似乎没有任何简单的方法来确保Liquibase具有特定名称的序列.我该怎么做才能让这个设置起作用?

我看起来好像正在跑步

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

Cra*_*ger 5

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

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

Hibernate的怪异hibernate_sequence尤其令人痛苦。我不明白为什么它不使用 PostgreSQL 默认序列来生成列。