Как стать автором
Обновить

Flyway + Spring Boot: настройка и написание миграций баз данных

Уровень сложностиПростой
Время на прочтение11 мин
Количество просмотров3.6K
Всего голосов 14: ↑14 и ↓0+16
Комментарии3

Комментарии 3

Понятно, что статья больше для рекламы продукта и пиара компании, но давайте делать примеры с качественным кодом.

Версионирование миграций вида V1__ V2__ сразу же сломается, когда 2 разработчика начнут делать фичи параллельно. Для обхода этого есть подход использовать таймштампа в версии https://www.jeremyjarrell.com/using-flyway-db-with-distributed-version-control/

Генерация портянки кода вида

Class<?> oEffectiveClass = o instanceof HibernateProxy
                ? ((HibernateProxy) o).getHibernateLazyInitializer()
                .getPersistentClass()
                : o.getClass();
Class<?> thisEffectiveClass = this instanceof HibernateProxy
                ? ((HibernateProxy) this).getHibernateLazyInitializer()
                .getPersistentClass()
                : this.getClass();
if (thisEffectiveClass != oEffectiveClass) return false;
Comment comment = (Comment) o;

видимо пошла из помогаторов вида jpa buddy. Неужели не проще и более читаемо делать проверку на instanceof? У нас классы расширяются cglib-ом через наследование и прокси-класс будет наследником класса entity. Как по мне более читаемо:

 if (!(o instanceof Comment comment)) return false;

Непонятно, зачем задано ограничение на строку комментария varchar(255)? Во-первых, почему именно 255? Чем так привлекло это число, почему не varchar(4000)? Во-вторых, для текста в Postgres есть почти безлимитный text.

Еще непонятно, почему для даты используется timestamp without time zone, который по смыслу хранит локальное время LocalDateTime? Если у нас 1 клиент БД с одной TZ, то вроде бы и ок. Но если у нас появится клиент (приложение) в другой TZ, то время будет уже неверным.

  1. В Amplicode можно настроить именование скриптов версионирования, в том числе и ваш вариант.

  2. Действительно, такие equals hashcode пришли из JPA Buddy (https://jpa-buddy.com/blog/hopefully-the-final-article-about-equals-and-hashcode-for-jpa-entities-with-db-generated-ids/), ведь его делала наша команда)

  3. Ограничение 255 не случайно, это дефолт, который использует JPA. Можно конечно его проигнорировать, но лучше, когда модель и бд согласованы, правда? Тем не менее, можно поменять настройки маппинга JPA типов на database типы

  4. Это модельное приложение, для него LocalDateTime вполне достаточен)

@vasyakolobok77 спасибо за развёрнутый комментарий! 

Полностью согласен с @alexander-shustanov, лишь дополню:

1) Да, всё это дело настраиваемое и каждый может настроить под свой проект

2) На вашем проекте instanceof подходит, на других не подойдёт. В целом, мы можем посмотреть в сторону того, чтобы дать возможность генерировать несколько реализацией. Но нужно провести анализ и убедиться, что действительно не будет никаких сайд эффектов в случае использования этого подхода. С той реализацией которую мы генерируем, проблем точно не будет, хоть она и может выглядеть как "портянка" :)

По 3 и 4 пунктам добавить нечего. 

Зарегистрируйтесь на Хабре, чтобы оставить комментарий