我在 PostgreSQL 上有一个 BD,并且有很多表,但我的问题是在 Usuario 表上。
我使用以下脚本创建表:
CREATE SEQUENCE usuario_id_seq;
CREATE TABLE public.usuario
(
id BIGINT NOT NULL DEFAULT nextval ('usuario_id_seq'::regclass),
administrador BOOLEAN NULL,
password CHARACTER VARYING (20) NOT NULL,
username CHARACTER VARYING (40) NOT NULL,
CONSTRAINT usuario_pkey PRIMARY KEY (id)
NOT DEFERRABLE INITIALLY IMMEDIATE,
CONSTRAINT uk_863n1y3x0jalatoir4325ehal UNIQUE (username)
NOT DEFERRABLE INITIALLY IMMEDIATE
);
我插入一个用户:
Insert into usuario (username, password, administrador) values ('prueba', '1234', false);
一切顺利,现在我在 Spring-boot 上有了这个:
@Entity
@Table(name = "usuario")
public class Usuario implements Serializable {
@Id
@GeneratedValue
private Long id;
@NotNull
@Size(max = 40)
@Column(name = "username", unique = true)
private String username;
@NotNull
@Size(max = 20)
@Column(name = "password")
private String password;
@Column(name = "administrador")
private boolean administrador;
@ManyToMany(cascade = {
CascadeType.ALL
})
@JoinTable(name = "usuario_alerta",
joinColumns = {@JoinColumn(name = "id_usuario", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "id_alerta", referencedColumnName = "id")})
private Set<Alerta> alertasUsuario;
@ManyToMany(cascade = {
CascadeType.ALL
})
@JoinTable(name = "usuario_producto",
joinColumns = {@JoinColumn(name = "id_usuario", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "id_producto", referencedColumnName = "id")})
private Set<Producto> productosUsuario;
// Hibernate requires a no-arg constructor
public Usuario() {
}
public Usuario(String username, String password, boolean administrador) {
this.username = username;
this.password = password;
this.administrador = administrador;
}
..... Getters and Setters
现在,当我尝试使用 API 插入表 Usuario 时,调用此:
@PostMapping("/usuario")
ResponseEntity<Usuario> newUser(@ModelAttribute Usuario usuario) {
Usuario user = usuarioRepository.save(usuario);
if(user != null)
return new ResponseEntity<Usuario>(user, HttpStatus.CREATED);
return new ResponseEntity<Usuario>(user, HttpStatus.BAD_REQUEST);
}
我收到错误:
Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "usuario_pkey" Detail: Key (id)=(1) already exists.
这是因为我在初始化脚本上创建了 id=1 的用户。
在使用 Spring-boot 之后,我可以使用 SQL 将谁插入到表中而不会出现此错误?
最佳答案
好吧,我看到 @GenerateValue
有一个属性 generator
所以我只是尝试添加我之前创建的序列生成器,它就可以工作了。因此,解决方案如下:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator="usuario_id_seq")
private Long id;
关于java - 通过 API POST 插入时出现重复键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56797117/