Как управлять уникальными идентификаторами с Hibernate и Flyway?

Вот фрагмент моего класса сущности

@Entity
public class User {

    @Id
    @GeneratedValue
    private long id;

    private String firstName;
    private String lastName;

При использовании (Spring Boot + Hibernate) схема настройки Spring Boot автоматически включает последовательности, подобные приведенной ниже.

Hibernate: create sequence hibernate_sequence start with 1 increment by 1

Но я использую Flyway 5.0.7 для настройки моей схемы. И в этом случае я получаю ошибку ниже, что означает, что последовательность не создается.

Sequence "HIBERNATE_SEQUENCE" not found; SQL statement

Я смог исправить это, создав последовательность, используя скрипт flyway, как показано ниже

create sequence HIBERNATE_SEQUENCE start with 1001;

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

Можно ли создавать последовательности с использованием Hibernate при использовании Flyway? В противном случае нецелесообразно вручную создавать последовательности для всех объектов, которые могут быть сотнями.

Любой альтернативный подход, чтобы справиться с этим?

1 ответ

Flyway - это инструмент миграции БД, и он не знает о каких-либо изменениях DDL/DML, если вы не сообщите об этом (через новые сценарии в свойстве location).

Если Hibernate обрабатывает некоторые из этих изменений (последовательности в вашем случае), Flyway не узнает об этом и будет использовать любую последовательность, о которой уже знает.

Обычно нужно сообщить Flyway о ваших изменениях, которые включают новую последовательность, например, для новой сущности, так же, как вы делали бы для самой схемы вашей сущности. Мой личный совет - управлять всеми изменениями схемы в одном месте, поэтому, если вы используете Flyway, пусть он будет отвечать за все это.

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