2016-10-19 10 views
-1

私は現在まで数ヶ月間オンラインで既に動作している春の起動アプリケーションを持っています。私は、ID生成型配列を持つエンティティを持っていますので、GenerationType.SEQUENCEは既に存在するIDを生成します

@Entity 
@ComponentScan 
public class MyEntity { 
    /** 
    * 
    */ 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private long id; 
} 

新しいエンティティが作成され、保存されたときに、今日のイムエラーを取得:

Unique index or primary key violation: "PRIMARY_KEY_D92 ON PUBLIC.MyEntity(ID) VALUES (3713, 250)"; SQL statement: 

毎回このエラーは、この中で生成されたID(3713発生時ケース)が既にデータベースに存在しています。だから、なぜ突然、GenerationType.SEQUENCEが既に存在するIDを生成しているのですか?

EDIT

私はHibernateでこの問題が発生しましたが、我々は、明示的@SequenceGenerator注釈を持っていたH2 Databaseのバージョン1.4.191

答えて

1

を使用しています。問題は、JPAのデフォルトのSequenceGeneratorにはallocationSizeが50であることです。デフォルトのデータベース・シーケンスは1ずつ増加します。これら2つの値は同じにする必要があります。 1つの解決策は、SequenceGeneratorを定義し、そのallocationSizeを明示的に設定することです。

@SequenceGenerator(name = "my_entity_gen", sequenceName = "my_entity_id_seq", allocationSize = 1) 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_entity_gen") 

ジェネレータは、2つのテーブルで共有する必要がある場合を除き、一意である必要があります。

他の解決策は、異なる世代戦略を使用することです。

@GeneratedValue(strategy = GenerationType.IDENTITY) 

データベースがすでに彼らは通常そうであるように、あなたが明示的にテーブルの後にシーケンスを作成していない限り、挿入時に列を照会するために知っている場合、これは動作します。

最初のアプローチでは、すべての挿入に対してデータベースへの2つのクエリがトリガーされるため、ほぼ確実に効率が低下します。

+0

こんにちは。私が 'GenerationType.IDENTITY'に変更した場合、私はIDとしてヌル値だけを取得します。' 'ID" '列にNULLが許可されていません – Mulgard

+0

他の方法を試しましたか? 'persistence.xml'の' hibernate.id.optimizer.pooled.preferred'プロパティーを 'none'に設定すると、各挿入の前にシーケンスを使用する別の方法があります。大文字と小文字を区別。このプロパティは、Hibernate 5より前には使用できない可能性があります。バージョンまたはデータベースについて言及していません。 – coladict

関連する問題