Использовать последовательность, созданную Flyway в JPA

Я использую настройку Spring Boot 2 / Flyway / Postgres.

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

Я позволил Flyway выполнить сценарий PostgreSQL:

CREATE SEQUENCE config_id_seq;

CREATE TABLE config
(
    ID          BIGINT NOT NULL PRIMARY KEY DEFAULT nextval('config_id_seq'),
    DESCRIPTION VARCHAR(500)
);

А это определение сущности:

@Entity
@Table(name = "config")
public class Config {

    @Id
    @SequenceGenerator(name = "config_id_sequence", sequenceName = "config_id_seq")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "config_id_sequence")
    @Column(name = "id")
    private long id;

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

При запуске возникают следующие ошибки:

Caused by: org.postgresql.util.PSQLException: ERROR: relation "config_id_seq" already exists
Caused by: org.postgresql.util.PSQLException: ERROR: cannot change sequence "config_id_seq"

Я считаю, что Flyway успешно выполнил сценарий и создал последовательность. Но JPA хочет создать последовательность позже и терпит неудачу, потому что она уже существует. Пожалуйста, поправьте меня, если я здесь не прав.

Теперь, как я могу настроить JPA для повторного использования существующей последовательности, если это возможно?

JPA не использует спецификации столбцов "по умолчанию". Указание GeneratedValue говорит, что JPA использует последовательность, извлекает само следующее значение, а затем использует его в INSERT ... не то, что вы хотите (вы хотите, чтобы столбец был исключен из INSERT, поэтому он затем использует спецификацию по умолчанию ... невозможно)

user3973283 29.10.2018 14:16

@BillyFrost: Если я правильно понял, мне следует отказаться от команд sequence и nextval () и использовать для этого JPA?

Steve Benett 29.10.2018 14:25

да. это то, что требуется для создания ценности JPA. Затем он создает последовательность и управляет вызовами nextval

user3973283 29.10.2018 15:53

@BillyFrost: Интересно. Итак, какой способ JPA для подключения к существующей базе данных, где последовательность используется для увеличения идентификатора? Даже с ddl-auto: нет?

Steve Benett 30.10.2018 11:51

В качестве второго варианта вы можете установить стратегию генерации IDENTITY, то есть значение поля устанавливается в базе данных (предназначено для типов auto_increment / serial). Это может сработать в вашем случае. Однако при этом вы потеряете возможность выполнять массовую вставку с помощью JPA.

user3973283 30.10.2018 12:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
1 759
1

Ответы 1

Нам нужно установить для свойства spring.jpa.hibernate.ddl-auto значение none, или вы можете пропустить это свойство, чтобы Spring не создавал объекты базы данных самостоятельно.

Если мы используем пролетный путь, мы должны возложить ответственность за создание объектов базы данных только на пролетный путь, то есть создавать все объекты базы данных с помощью сценариев пролетного пути только как таблицы и последовательность.

Указание GeneratedValue указывает JPA использовать последовательность, извлекать само следующее значение, а затем использовать его в INSERT.

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

Другие вопросы по теме