我有一个使用标准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具有特定名称的序列。我该怎么做才能让这个设置起作用?
我看起来正在运行
答案 0 :(得分:4)
使用GenerationType.IDENTITY
。这适用于大多数数据库。
在我看来,身份生成是JPA的一个瑕疵;根据您正在使用的数据库等为生成选项设置全局覆盖太难了。在注释中进行操作会很难以编程方式进行调整。
Hibernate的奇怪hibernate_sequence
特别痛苦。超出我的原因是它没有将PostgreSQL默认序列用于生成的列。