Как обычно, типы переименования 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.
Использование currenlty поддерживается как EnumType.ORDINAL, так и EnumType.STRING. Я полагаю, что это не очень хорошая идея.
И еще вопрос. Как заполнить таблицу myEnums
с использованием данных класса Java MyEnum
? Как бы вы это сделали? Наилучший подход.
PS: вот решения, которые я могу предложить:
Предположим, что существует таблица MyEnum
с code
и имя fields
. Java MyEnum
перечисление, которое описано в вопросе. Таблица 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.
Что касается базы данных для заполнения. Я думаю, что нелегко написать script, который очищает таблицу MyEnum
, а затем для каждого перечисления Java istance делает вставку в таблицу. И всегда делайте это на этапе развертывания.