Liquibase生成bigint ID而不是varchar

时间:2013-06-12 16:35:06

标签: database postgresql database-schema liquibase dropwizard

我只是在PostgreSQL上使用Dropwizard和Hibernate尝试Liquibase,所有最新版本,但我遇到了麻烦。我打算将Hibernate的UUID生成器用于我的类ID,这会生成一个String PK。我在表格中指定了一个名为varchar(32)的{​​{1}}字段,但Liquidbase却生成了id个字段。然而有趣的是,这两个表有不同的列:bigint具有序列portfolio.id,而Stock没有序列。

我做错了什么,或者这只是Liquibase ID列的一些奇怪属性?我应该使用portfolio_id_seq吗?代码如下:

migrations.xml:

bigint

Portfolio.java:

<changeSet id="1" author="orlade">
    <createTable tableName="stock">
        <column name="id" type="varchar(255)">
            <constraints primaryKey="true" nullable="false" />
        </column>
        <column name="name" type="varchar(255)">
            <constraints nullable="false" />
        </column>
        <column name="symbol" type="varchar(255)">
            <constraints nullable="false" />
        </column>
        <column name="description" type="varchar(255)" />
    </createTable>

    <createTable tableName="portfolio">
        <column name="id" type="varchar(255)">
            <constraints primaryKey="true" nullable="false" />
        </column>
        <column name="name" type="varchar(255)">
            <constraints nullable="false" />
        </column>
        <column name="description" type="varchar(255)" />
    </createTable>
</changeSet>

Stock.java:

@Entity
@Table(name = "portfolio")
public class Portfolio {
  @Id
  @GeneratedValue(generator = "system-uuid")
  @GenericGenerator(name = "system-uuid", strategy = "uuid")
  private String id;
}

1 个答案:

答案 0 :(得分:3)

因此虽然我找不到有效的Liquidbase类型列表,但事实证明UUID是一个,所以我使用了它,并将Java类型也改为java.util.UUID。这似乎足以让Liquidbase创建uuid类型的列,但后来我开始在Java中遇到无法将字符串写入UUID或其他任何内容的错误。

(或至少一个)解决方案原来是使用@Type注释来指定希望Hibernate在写入数据库之前将值转换为的类型。只是说它是java.util.UUID似乎不够。以下设置有效:

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Type(type = "pg-uuid")
private UUID id;

uuid2策略可以generate UUID, String or byte[16] values,默认情况下,它似乎尝试使用bytea类型写入Postgres。指定修复此类型的类型(根据Postgresql UUID supported by Hibernate?),我也不知道为什么它不是默认值。