我有一个以下的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.
我的配置有什么问题?
答案 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”。