Как синхронизировать перечисление в коде с колонкой в БД?
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 шт):
Числовые идентификаторы лучше, так как их нет смысла изменять намеренно.
А от случайного изменения защищает юнит тест, который проверяет соответствие числовых констант и значений enum-a. Если кто-то случайно изменит - тест упадет с соответствующим сообщением. Тогда разработчик примет решение, действительно ли он хочет изменить константу (а значит и написать миграцию БД) или все же откатить это изменение.