#java #hibernate #enumeration #lookup-tables
#java #спящий режим #перечисление #поисковые таблицы
Вопрос:
Я нашел здесь несколько похожих вопросов, но не совсем то же самое.
Если значения моего перечисления не являются ординалами, как я могу сопоставить поле класса с этим типом перечисления?
— Уровень базы данных — значения таблицы поиска
insert into ShowInfoLookup(ID, Name) values (0 | 64, 'Hide (auto set by the system)');
insert into ShowInfoLookup(ID, Name) values (1 | 64, 'Show (auto set by the system)');
insert into ShowInfoLookup(ID, Name) values (0 | 128, 'Hide (manually set)');
insert into ShowInfoLookup(ID, Name) values (1 | 128, 'Show (manually set)');
— Java-код перечисления
package com.test.constants;
public enum ShowInfoLookup {
Invalid(0),
HideAutoSet(Value.HIDE | Value.AUTO_SET), // 64
ShowAutoSet(Value.SHOW | Value.AUTO_SET), // 65
HideManuallySet(Value.HIDE | Value.MANUALLY_SET), // 128
ShowManuallySet(Value.SHOW | Value.MANUALLY_SET); // 129
private static class Value {
private static final int HIDE = 0; // false - hide
private static final int SHOW = 1; // true - show
private static final int AUTO_SET = 64;
private static final int MANUALLY_SET = 128;
}
private int value = 0;
private ShowInfoLookup(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public String toString() {
return String.valueOf(value);
}
public static ShowInfoLookup getInstance(int value) {
for (ShowInfoLookup type : ShowInfoLookup.values()) {
if (value == type.value) {
return type;
}
}
return Invalid;
}
}
— Класс сущности Hibernate, который у меня есть, я знаю EnumType.ПОРЯДКОВЫЙ номер здесь не будет работать
public class Item {
@Column(name ="ShowAnalystInfo", nullable = false)
@Enumerated(EnumType.ORDINAL)
private ShowInfoLookup showInfo;
}
Комментарии:
1. Вы могли бы создать режим гибернации
UserType
. Аналогичный пример для пользовательского сопоставления перечислений здесь .2. @RobbyCornelissen Спасибо, но для меня это звучит излишне. Нет ли какого-нибудь более простого способа? Я имею в виду, что-то вроде общего RatingUserType :), который будет работать для всех видов перечислений, а не только для перечисления рейтинга.
3. Конечно, вы могли бы пометить
enum
в сущности как@Transient
, добавить еще одно целочисленное поле для представления значенияenum
, чтобы оно сохранялось, и синхронизировать оба поля в методах получения / установки или с использованием методов жизненного цикла сущности.4. @RobbyCornelissen Хорошо, спасибо, я подумаю об этом. Я также только что нашел это: gabiaxel.com/2011/01/better-enum-mapping-with-hibernate.html . Звучит прямо в точку, но также требует дополнительной работы.
5. Общая
RatingUserType
идея также должна быть более или менее выполнима. При условии, что все вашиenum
системы расширяют общий интерфейс.