我有一个使用标准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 - hibernate 4.1.7 - postgres driver 9.1-901.jdbc3 - postgres 9.2.1(至少在本地) - h2 1.3.168
GenerationType.IDENTITY
怎么样?总的来说,在我看来,这是 JPA 中的一项缺陷;所有这些基于注释的配置使得在目标数据库需要变化时很难进行调整。 - Craig Ringer