Spring Data PostgreSQL Key已存在错误

时间:2016-03-08 15:29:41

标签: java spring postgresql spring-data

我有一个以下的PostgreSQL表:

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

和相应的Spring Data实体:

@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.SEQUENCE, generator = "levels_id_seq")
    private Integer id;

    private String name;

...
}

@MappedSuperclass
public abstract class BaseEntity {

    @Column(name = "created_date")
    private Date createdDate;

    @Column(name = "updated_date")
    private Date updatedDate;

    @PrePersist
    void onCreate() {
        setCreatedDate(new Date());
    }

    @PreUpdate
    void onPersist() {
        setUpdatedDate(new Date());
    }

...
}

这是我的Spring Data Level Repository:

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

    Level findByName(String name);

}

现在,当我尝试使用Spring LevelRepository保存新的Level实体时,我收到以下错误:

ERROR:  duplicate key violates unique constraint « levels_pkey »
DETAIL: Key "(id)=(5)" already exists.

我的配置有什么问题?

2 个答案:

答案 0 :(得分:2)

使用strategy=GenerationType.AUTO而你应该是好的。 strategy=GenerationType.AUTO将使用表来生成ID,而不是使用序列。

答案 1 :(得分:1)

如果您想离开GenerationType而不是使用GenarationType.AUTO from that answer

并且发生错误可能是由于data.sql文件中的硬编码插入引起的。

使用实体中定义的顺序插入

INSERT INTO levels(id, name) VALUES (nextval('levels_id_seq'), 'test');

GenerationType.IDENTITY相同,将创建序列“%Your-table-name%_id_seq”。