JPA, Spring-Boot и PostgreSQL. Webapp пытается сгенерировать уже существующие первичные ключи после импорта сценария заполнения

#java #postgresql #spring-boot

Вопрос:

Я разрабатываю веб-приложение с использованием Spring-Boot 2 и PostgreSQL. Моя проблема в том, что разработка началась с использования MYSQL 8.0 и H2 в качестве баз данных, и у меня не было никаких проблем с ними. Из-за ограничений развертывания мне необходимо настроить базу данных PostgreSQL.

Я обнаружил, что после импорта моего сценария заполнения мое веб-приложение будет пытаться генерировать повторяющиеся идентификаторы, уже существующие из сценария, вместо того, чтобы следовать за последним идентификатором, содержащимся в базе данных.

Это мое BaseEntity.class

 /**
    * Simple JavaBean domain object with an id property. Used as a base class for objects
    * needing this property.
    *
    * @author Ken Krebs
    * @author Juergen Hoeller
    */

@MappedSuperclass
public class BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer id;

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public boolean isNew() {
    return this.id == null;
}

}
 

И часть населения sql-скрипт

 -- Valoraciones Usuario 1
INSERT INTO valoracion(id, puntuacion, comentario, beaver_id, author_id) VALUES (1, 4.5, 'Muy profesional, su trabajo ha sido perfecto y muy puntual.', 1, 2);
INSERT INTO valoracion(id, puntuacion, comentario, beaver_id, author_id) VALUES (2, 3.5, 'Profesional y puntual.', 1, 3);
INSERT INTO valoracion(id, puntuacion, comentario, beaver_id, author_id) VALUES (3, 2.1, 'Mucho arte, pero nada puntual con la entrega.', 1, 4);
INSERT INTO valoracion(id, puntuacion, comentario, beaver_id, author_id) VALUES (4, 1.0, 'Pésimo trabajo. Nada profesional.', 1, 5);
INSERT INTO valoracion(id, puntuacion, comentario, beaver_id, author_id) VALUES (5, 3.3, 'Puntual y barato.', 1, 6);
INSERT INTO valoracion(id, puntuacion, comentario, beaver_id, author_id) VALUES (6, 5.0, 'Su trabajo es increible, lo recomiendo.', 1, 7);
INSERT INTO valoracion(id, puntuacion, comentario, beaver_id, author_id) VALUES (7, 1.2, 'Malisimo trabajo, nada satisfecho.', 1, 8);
 

Комментарии:

1. Используйте последовательность как для сценария заполнения, так и для ссылки на нее вашей сущности

2. Даже не нужно ссылаться на последовательность в сущности, типе поколения. Идентификатор справится с этим, если тип первичного ключа является ПОСЛЕДОВАТЕЛЬНЫМ.

Ответ №1:

Похоже, вам нужно перезапустить последовательность идентификаторов на вашем столе.

 ALTER SEQUENCE table_name_id_seq RESTART WITH 8;