web-dev-qa-db-ja.com

バッチ挿入でのPostgresエラー:リレーション "hibernate_sequence"は17の位置に存在しません

Hibernate jpaバッチ更新を実行していますが、次のエラーが表示されます

2015-04-21 15:53:51,907 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (Thread-283 (HornetQ-client-global-threads-462057890)) SQL Error: 0, SQLState: 42P01
2015-04-21 15:53:51,908 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (Thread-283 (HornetQ-client-global-threads-462057890)) ERROR: relation "my_seq_gen" does not exist

私はpostgresデータベースを使用しており、IDは自動生成されます

  @Id
@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN"initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seq-gen")
@Column(name="\"ID\"",unique=true,nullable=false)
private int id;

これは私のバッチ挿入コードスニペットです

getEm().getTransaction().begin();
System.out.println("transaction started--------------");
try {   
    for (Receipt ReceiptEntity : arrReceiptEntity) {
            getEm().persist(ReceiptEntity);
    }
    getEm().getTransaction().commit();
    System.out.println("commited");
} catch (Exception exception) {
    System.out.println("error----------------------------------------------------------------------");
    if(getEm().getTransaction().isActive())
        getEm().getTransaction().rollback();
    LOG.error(exception);
} finally {
    getEm().flush();
    getEm().clear();
    getEm().close();
}

Persistence.xmlに次のプロパティを追加しました

         <property name="hibernate.id.new_generator_mappings" value="true"/>

私が間違っていることを提案してください。

22
kirti

idに_@Id_および@GeneratedValue(strategy=GenerationType.IDENTITY)の注釈を付けてください。 PostgreSqlでうまくいきました。

更新:id列がSERIALまたはBIGSERIAL型として宣言されている場合にのみ機能します。

40

エンティティ定義を変更したくない場合、hibernate_sequenceという名前でpostgreSQLスキーマにシーケンスを作成する必要があります。

CREATE SEQUENCE hibernate_sequence START 1;

[〜#〜] update [〜#〜]

エンティティに定義した2番目のシーケンスgeneratefがありません。前のように追加します。

CREATE SEQUENCE my_seq_gen START 1;

役に立つ痛いチュートリアル: http://www.concretepage.com/hibernate/generatedvalue-strategy-generationtype-sequence-hibernate

12
Beri

答えが得られることを望みますが、まだ答えが見つかっている場合、これは役に立ちます。

私は同じ問題を抱えていたので、idのgetterメソッドに@SequenceGeneratorおよび@GeneratedValue

@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN", initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seq-gen")
public int getId(){
    return id;
}
6
Sameer

以下を試してみてください:

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO, generator = "auto_gen")
  @SequenceGenerator(name = "auto_gen", sequenceName = "A")
  @Column(name = "ID")
  private int id;

ありがとう

3
Mayur

私は同じ問題を抱えていました。そのように動作するpostgresのテーブルからid列に自動インクリメントを置くことを解決しました.

ALTER TABLE mytable ALTER COLUMN id SET DEFAULT nextval('mytable_id_seq');

ALTER SEQUENCE mytable_id_seq OWNED BY mytable.id; 
2
Sergeant

私の場合、プロパティname = "hibernate.hbm2ddl.auto" value = "pdate"を追加すると、問題が解決しました。 persistence.xmlに上記のプロパティを追加する必要があります

1
Vijay Vikranth

投稿によると、 hibernateは次のシーケンス値を取得できませんでした@ GeneratedId列を戦略に設定しますGenerationType.IDENTITYではなくGenerationType.SEQUENCE。だから、あなたは持っているだろう

@Id
@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN"initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.IDENTITY, generator="seq-gen")
@Column(name="\"ID\"",unique=true,nullable=false)
private int id;
1

場合によっては、@Id @GeneratedValue(strategy=GenerationType.IDENTITY)アノテーションを使用して、シーケンスを空の間隔(削除後)および誤った次の自動インクリメント位置にできます。 次の自動インクリメント値を設定するを最大のid値の後の位置に設定してみてください:

ALTER SEQUENCE schema.entity_id_seq RESTART WITH 40072;
0
Zon