我只是在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;
}
答案 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?),我也不知道为什么它不是默认值。