Отображение перечислимых типов JPA. Лучший подход
Как обычно, типы перечислений Java имеют соответствующие коды и описание имени. И классы Java, которые содержат такие поля, содержат их как Enum:
public enum MyEnum{
SOMEINSTANCE(1, "test1"),
SOMEINSTANCE(2, "test2");
private final int code;
private final String name;
private MyEnum(int code, String name){
this.code = code;
this.name = name;
}
... helper getter for code and name
}
@Entity
puclic class EnumHolder{
private MyEnum myEnum;
}
Я новичок в JPA, но я хочу иметьmyEnums
'стол, выглядел как:
code int not null, name varchar(50) not null)
И по моемуenumHolder
стол, который я хочу иметьmyEnumCode
поле, которое указывает на таблицу myEnums.
Использование currentlty поддерживается как EnumType.ORDINAL, так и EnumType.STRING. Я полагаю, это не очень хорошая идея.
И еще один вопрос. Как я могу заполнитьmyEnums
таблица с использованием JavaMyEnum
данные класса? Как бы вы это сделали? Лучший подход, пожалуйста.
PS: вот решения, которые я могу предложить:
Давайте предположим, что есть таблицаmyEnum
с участиемcode
и имяfields
, ЯваMyEnum
enum, что описано в вопросе.enumHolder
стол надо иметьmyEnumCode
ссылка наmyEnum.code
поле. Пожалуйста, прокомментируйте решение, если вы не согласны.
@Entity
@Access(AccessType.FIELD)
public class EnumHolder {
@Id private int id;
@Transient private MyEnum myEnum;
…
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public MyEnum getMyEnum() { return MyEnum; }
public void setMyEnum(MyEnum myEnum) { this.myEnum = myEnum; }
@Access(AccessType.PROPERTY) @Column(name="myEnumCode")
protected int getMyEnumForDb() {
return myEnum.getCode();
}
protected void setMyEnumForDb(int enumCode) {
myEnum = MyEnum.getByCode( enumCode);
}
…
}
Конечно, здесь есть недостатки. Но на данный момент я не вижу лучшего подхода. Альтернативы с EnumType.ORDINAL и EnumType.STRING, пожалуйста, не предлагайте. Я не хочу писать здесь все проблемы, которые могут существовать с его использованием (в Эффективной Java это описано относительно использования ординалов). Использование EnumType.STRING мне тоже не нравится, потому что он не позволяет иметь описание в базе данных и запрашивать его у db.
По поводу базы данных fillind. Я думаю, что это не сложно написать сценарий, который очищаетmyEnum
таблица, а затем для каждого перечисления Java делает вставку в таблицу. И всегда делайте это на этапе развертывания.