Ошибка дублирования ключа при вставке через API POST - PullRequest
0 голосов
/ 27 июня 2019

У меня есть BD на PostgreSQL, и у меня много таблиц, но моя проблема в таблице 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

Теперь, когда я пытаюсь вставить в таблицу Usuario с помощью API, вызывая это:

@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 в сценарии инициализации.

Кто можетвставить в таблицу с помощью SQL и после использования Spring-boot без этой ошибки?

1 Ответ

0 голосов
/ 27 июня 2019

Хорошо, я увидел, что @GeneratedValue имеет атрибут generator, поэтому я просто пытаюсь добавить генератор последовательности, который я создал ранее, и он работает. Итак, решение было поставлено этой строкой так:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator="usuario_id_seq")
private Long id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...