1

PostgreSQL で Dropwizard と Hibernate を使用して Liquibase を試しているところですが、すべて最新バージョンですが、問題が発生しました。String PK を生成する Hibernate の UUID ジェネレーターをクラス ID に使用するつもりでした。varchar(32)テーブルで呼び出されるフィールドが必要だと指定しましたが、代わりにidLiquidbase がbigintフィールドを生成しました。しかし興味深いことに、2 つのテーブルは異なる列portfolio.idを持っportfolio_id_seqています。

私は何か間違ったことをしましたか、それとも Liquibase の ID 列の奇妙なプロパティですか? sを使用する必要がありbigintますか? 以下のコード:

migrations.xml:

<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>

Portfolio.java:

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

Stock.java:

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

1 に答える 1

3

したがって、有効な Liquidbase タイプのリストは見つかりませんが、それが 1 つであることが判明したUUIDので、それを使用し、Java タイプjava.util.UUIDも同様に変更しました。これは、Liquidbase に type の列を作成させるのに十分なように見えましたがuuid、Java で String を UUID などに書き込めないというエラーが発生し始めました。

(または少なくとも) 解決策は、 @Type アノテーションを使用して、データベースに書き込む前に Hibernate が値を変換する型を指定することであることが判明しました。だと言うだけでjava.util.UUIDは十分ではないようです。以下のセットアップは機能しました:

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

このuuid2戦略は、UUID、String、または byte[16] 値を生成byteaでき、デフォルトでは、型を使用して Postgres に書き込もうとするようです。タイプを指定すると、これが修正されました ( Postgresql UUID supported by Hibernate?に従って)。また、それがデフォルトではない理由もわかりません。

于 2013-06-13T02:12:56.293 に答える