Как управлять уникальными идентификаторами с 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, пусть он будет отвечать за все это.