java - 通过 API POST 插入时出现重复键错误

标签 java postgresql spring-boot

我在 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/

相关文章:

java - 确定一个 Instant 是否是另一个 Instant 之后的一天,考虑时区

java - 在应用程序中的每个 Activity 上显示相同的 TextView/"permanent"textView?

postgresql - PL/pgSQL 函数中的语法错误

java - Spring Boot 有什么方法可以定义 JTA 资源吗?

java - 如何在 JFrame/java 中从右到左对齐?

java - While 循环有问题吗?

django - PostgreSQL 和 Django 中的不精确全文搜索

postgresql - 如何解释 psycopg 安装错误 OSX?

java - 如何使用 Elastic 对最后的 Null 进行排序?

docker-compose - 外部化 spring application.properties