Как синхронизировать перечисление в коде с колонкой в БД?

spring+hibernate

Есть сущность User с enum-свойством status

User {
    int id;
    String username;
    String password;
    Status status;
}

enum Status {
    ACTIVE, DELETED
}

В базе данных есть связанная с сущностью таблица db.users.

Суть в следующем:

Если поле db.users.status имеет тип VARCHAR, при добавлении строки оно может быть заполнено напрямую, с помощью метода name() (Status.DELETED.name()). Однако если в будущем кто-то изменит перечисление, ( Status.DELETED превратится в Status.REMOVED), поля колонки останутся прежними.

Тогда можно сделать тип колонки db.users.status равным INT, и либо создать int-свойство в нашем перечислении, либо реализовать какой-нибудь AttributeConverter. В обоих случаях статусы имели бы свои номера, которыми мы могли бы заполнить соответствующую колонку. Данный подход в каком-то смысле решает проблему выше, однако если в коде по какой-то причине изменились статусы, та же история может случиться и с их номерами, да и колонка таблицы в этом случае становится менее читабельной.

Как можно решить проблему синхронизации? Какой подход считается наиболее предпочтительным в таких ситуациях?


Ответы (1 шт):

Автор решения: Roman Konoval

Числовые идентификаторы лучше, так как их нет смысла изменять намеренно.

А от случайного изменения защищает юнит тест, который проверяет соответствие числовых констант и значений enum-a. Если кто-то случайно изменит - тест упадет с соответствующим сообщением. Тогда разработчик примет решение, действительно ли он хочет изменить константу (а значит и написать миграцию БД) или все же откатить это изменение.

→ Ссылка