Spring Boot Hibernate отображает набор перечислений в логические столбцы - PullRequest
0 голосов
/ 30 октября 2019

У меня есть форма Form в приложении Spring Boot:

@Data
@Entity
public class Form {
    @Id
    private String caseId;
    private String leadingUnit;
    private Set<Addiction> currentAddictions;
}

Зависимость является перечислением:

public enum Addiction {
  Alcohol, Nicotine, Drugs
}

И я хотел бы отобразить всю форму на одну таблицу в базе данных,Со следующими столбцами: caseId, leadUnit, currentAddictionsAlcohol, currentAddictionsNicotine и currentAddictionsDrugs. Я бы хотел, чтобы столбцы currentAddictions * имели логическое значение, указывающее, только если в наборе присутствует текущая зависимость. Я смотрел на пользовательские типы пользователей, но я не знаю, как это сделать. Есть ли простое решение для этого?

1 Ответ

1 голос
/ 30 октября 2019

Это не так (сопоставьте набор с булевыми столбцами). Но вот несколько вариантов. Я думаю, что оба варианта требуют отображения отдельных логических значений в классе сущностей. Я хочу быть предельно ясным: правильный способ отобразить это - иметь таблицу зависимостей, а затем связать таблицы. Если позже вы захотите добавить дополнительную зависимость, это просто вставит новую строку, а не изменит структуру базы данных.

  • Измените интерфейс вашего класса, чтобы получить / установить для каждого логического значения, каждый метод set затем добавляет или удаляет значение из Set, которое не сохраняется. Set можно изменить только из логических методов set. И вам, вероятно, нужно использовать метод жизненного цикла @PostLoad для заполнения набора после загрузки сущности.

  • В основном наоборот: Set предоставляется только с помощью нескольких вспомогательных методов addAddiction(Addiction) и removeAddiction(Addiction). Эти методы внутренне обновляют логические значения, которые никак не отображаются. Таким образом, из интерфейса класса у вас есть только Set.

Последний вариант, но это немного продвинутый подход (так что больше вуду), это использовать CompositeUserType. Вы также можете найти здесь несколько примеров того, как создать этот класс: пример 1 , пример 2 .

Я бы порекомендовал держаться подальше от CustomUserType, так каквсе может быть очень сложно, если, например, вы хотите запросить все строки с помощью addiction = Alcohol. И, пожалуйста, рассмотрите возможность сопоставления зависимостей с их собственной таблицей. Ваше будущее я (или будущие сопровождающие) это оценят.

...