Я использую настройку 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 для повторного использования существующей последовательности, если это возможно?
@BillyFrost: Если я правильно понял, мне следует отказаться от команд sequence и nextval () и использовать для этого JPA?
да. это то, что требуется для создания ценности JPA. Затем он создает последовательность и управляет вызовами nextval
@BillyFrost: Интересно. Итак, какой способ JPA для подключения к существующей базе данных, где последовательность используется для увеличения идентификатора? Даже с ddl-auto: нет?
В качестве второго варианта вы можете установить стратегию генерации IDENTITY, то есть значение поля устанавливается в базе данных (предназначено для типов auto_increment / serial). Это может сработать в вашем случае. Однако при этом вы потеряете возможность выполнять массовую вставку с помощью JPA.





Нам нужно установить для свойства spring.jpa.hibernate.ddl-auto значение none, или вы можете пропустить это свойство, чтобы Spring не создавал объекты базы данных самостоятельно.
Если мы используем пролетный путь, мы должны возложить ответственность за создание объектов базы данных только на пролетный путь, то есть создавать все объекты базы данных с помощью сценариев пролетного пути только как таблицы и последовательность.
Указание GeneratedValue указывает JPA использовать последовательность, извлекать само следующее значение, а затем использовать его в INSERT.
Но убедитесь, что у вас та же конфигурация, что вы упомянули в классе сущности и скрипте пролетного пути.
JPA не использует спецификации столбцов "по умолчанию". Указание
GeneratedValueговорит, что JPA использует последовательность, извлекает само следующее значение, а затем использует его в INSERT ... не то, что вы хотите (вы хотите, чтобы столбец был исключен из INSERT, поэтому он затем использует спецификацию по умолчанию ... невозможно)