6

Hibernate と Postgresql を使用してデータベース テーブルを自動的に作成したいのですが、シーケンスに関するエラーが発生します。Hibernate を使用してシーケンスを自動作成することは可能ですか、それとも手動でシーケンスを生成する必要がありますか?

私のエンティティの例:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

@Entity
@Table(uniqueConstraints = { @UniqueConstraint( columnNames =  { "id" }) })
@SequenceGenerator(name="SEQ_EXAMPLE_ID", sequenceName="example_id_seq", allocationSize=1)
public class Example {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_EXAMPLE_ID")
    private Long id;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String g
}

休止状態の設定:

hbm2ddl.auto=create-drop
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.show_sql=true 

例外:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.SQLGrammarException: could not get next sequence value

org.postgresql.util.PSQLException: ERROR: relation "example_id_seq" does not exist
4

4 に答える 4

1

Hibernate docsapplication.propertiesで説明されているように、自動スキーマ作成を有効にする必要があります。

hibernate.hbm2ddl.auto = create

またはSpringを使用する場合:

spring.jpa.hibernate.ddl-auto = create

しかし、一般的な推奨事項は、これを production で使用しないことです。Hibernate: hbm2ddl.auto=update in production?を参照してください。

代わりに、 LiquibaseFlywayなどのデータベース スキーマ移行ツールを使用してください。

于 2015-11-14T22:02:59.397 に答える
1

あなたのマッピングは正しいようです。正確に何が起こっているかを確認するために、次のカテゴリのログを有効にすることをお勧めします。

  • org.hibernate.tool.hbm2ddl: すべてのSQL DDL文を実行時にログに記録します

に設定してDEBUG、DDL ステートメントを確認します (おそらく、関連する部分で質問を更新します)。

PS: AnallocationSize=1はあまり賢明ではありません。デフォルトを使用する方が良いでしょう。しかし、それは無関係です。

参考文献

于 2010-08-28T22:21:12.273 に答える
-2

-hbm2ddl プロパティを使用してシーケンスを作成することはできません -テーブルは何度でも作成できますが、シーケンスは作成できません

シーケンスはデータベース固有であり、データベースで自分自身のシーケンスを作成する必要があります

于 2014-10-05T06:17:13.330 に答える