2016-03-19 7 views
1

存在し、私は次のPostgreSQLのテーブルを持っている:春データPostgreSQLのキーが既に私の春ブーツ/データ/ JPAアプリケーションでエラー2

CREATE TABLE IF NOT EXISTS levels (
    id SERIAL PRIMARY KEY, 
    name VARCHAR(256), 
    created_date timestamp, 
    updated_date timestamp 
); 

と春データ/ JPAエンティティ:

@Entity 
@Table(name = "levels") 
public class Level extends BaseEntity implements Serializable { 

    private static final long serialVersionUID = 642499791438799548L; 

    @Id 
    @SequenceGenerator(name = "levels_id_seq", sequenceName = "levels_id_seq", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "levels_id_seq") 
    private Long id; 

    private String name; 

... 
} 

また、私は、データベースに10のレベルを追加しました:

INSERT INTO levels (id, name) VALUES (1, 'Level 1') ON CONFLICT (id) DO NOTHING; 
    INSERT INTO levels (id, name) VALUES (2, 'Level 2') ON CONFLICT (id) DO NOTHING; 
    INSERT INTO levels (id, name) VALUES (3, 'Level 3') ON CONFLICT (id) DO NOTHING; 
    INSERT INTO levels (id, name) VALUES (4, 'Level 4') ON CONFLICT (id) DO NOTHING; 
    INSERT INTO levels (id, name) VALUES (5, 'Level 5') ON CONFLICT (id) DO NOTHING; 
    INSERT INTO levels (id, name) VALUES (6, 'Level 6') ON CONFLICT (id) DO NOTHING; 
    INSERT INTO levels (id, name) VALUES (7, 'Level 7') ON CONFLICT (id) DO NOTHING; 
    INSERT INTO levels (id, name) VALUES (8, 'Level 8') ON CONFLICT (id) DO NOTHING; 
    INSERT INTO levels (id, name) VALUES (9, 'Level 9') ON CONFLICT (id) DO NOTHING; 
    INSERT INTO levels (id, name) VALUES (10, 'Level 10') ON CONFLICT (id) DO NOTHING; 

私は新しいレベルを作成してみてください:

@Repository 
public interface LevelRepository extends JpaRepository<Level, Long> { 

    Level findByName(String name); 

} 

level = new Level(); 
level.setName(name); 
level = levelRepository.save(level); 
私は次の例外を受信して​​い

システムは id=1とない例 11のために選択したのはなぜ
ERROR: duplicate key violates unique constraint « levels_pkey » 
DETAIL: Key "(id)=(1)" already exists. 

答えて

4

シーケンスジェネレータは1から始まり、JPAインプリメンテーションフレームワークまたは挿入ステートメントでジェネレータコールを使用して各インサート後にインクリメントします。 RDBMSシーケンスジェネレータを使用している場合は、ハードコードされたID値を生のSQLに挿入しないでください。

今、あなたが順序を修正することができます:

ALTER SEQUENCE levels_id_seq 
    INCREMENT 1 
    MINVALUE 11 
    MAXVALUE 9223372036854775807 
START 11 
CACHE 1; 
ALTER TABLE levels 
    OWNER TO postgres; 

などのインサート修正:

INSERT INTO levels (id, name) VALUES (nextval(levels_id_seq), 'Level 1') ON CONFLICT (id) DO NOTHING; 
関連する問題