После весеннего перехода миграционные данные не считая строк для столбца SERIAL - PullRequest
0 голосов
/ 12 января 2020

У меня есть миграции, которые работают нормально, но после того, как миграция успешно создана в БД и загружены тестовые данные, я получаю ошибку при создании операции.

ОШИБКА: значение дублирующего ключа нарушает уникальное ограничение "users_pkey"
Подробно: ключ (id) = (1) уже существует.

Запрос из SQL журнала данных весны:

вставка в пользователей (account_non_expired, account_non_locked, credentials_non_expired , включено, пароль, имя пользователя) значения (?,?,?,?,?,?)

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

Моя users таблица:

CREATE TABLE IF NOT EXISTS users
(
    id                      BIGSERIAL PRIMARY KEY,
    username                VARCHAR(255) UNIQUE NOT NULL,
    password                VARCHAR(255)        NOT NULL,
    account_non_expired     BOOLEAN DEFAULT TRUE,
    account_non_locked      BOOLEAN DEFAULT TRUE,
    credentials_non_expired BOOLEAN DEFAULT TRUE,
    enabled                 BOOLEAN DEFAULT TRUE
);

Класс сущности:

@Data
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "users")
@EqualsAndHashCode(exclude = "roles")
@ToString(exclude = "roles")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    @Column(name = "account_non_expired")
    private Boolean accountNonExpired;

    @Column(name = "account_non_locked")
    private Boolean accountNonLocked;

    @Column(name = "credentials_non_expired")
    private Boolean credentialsNonExpired;

    @Column(name = "enabled")
    private Boolean enabled;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "users_roles",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
    private List<Role> roles;
}

На самом деле стратегия GenerationType.IDENTITY работает с BIGSERIAL, когда Я отправляю запросы 3 раза после прироста пребывания в нужном месте. С каждым запросом к БД Hibernate делай +1.

Это миграция данных пользователей:

INSERT INTO users (id, username, password)
VALUES (1, 'user', 'pass'),
       (2, 'operator', 'pass'),
       (3, 'admin', 'pass');

Как это исправить, для Hibernate можно заметить объем данных, полученных при запуске?

1 Ответ

0 голосов
/ 12 января 2020

Добавить в миграцию SELECT setval('users_id_seq', 4);

INSERT INTO users (id, username, password)
VALUES (1, 'user', 'pass'),
       (2, 'operator', 'pass'),
       (3, 'admin', 'pass');

SELECT setval('users_id_seq', 4);

Это устраняет конфликт между состоянием последовательности и реальным количеством строк.

...