5

データベースを生成するために、標準の 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
  • 休止状態 4.1.7
  • postgres ドライバー 9.1-901.jdbc3
  • postgres 9.2.1 (少なくともローカルで)
  • h2 1.3.168
4

1 に答える 1

4

を使用しGenerationType.IDENTITYます。これはほとんどのDBで機能するはずです。

私の意見では、ID生成はJPAの疣贅の1つです。使用しているDBなどに基づいて生成オプションのグローバルオーバーライドを設定するのは難しすぎます。注釈で設定すると、プログラムで調整するのが難しくなります。

Hibernateの奇妙なhibernate_sequenceことは特に痛いです。生成された列にPostgreSQLのデフォルトシーケンスを使用しない理由は私を超えています。

于 2012-10-31T11:29:30.030 に答える