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)
在我的表中,我希望有指向 myEnums 表的字段。enumHolder
myEnumCode
使用currenlty支持EnumType.ORDINAL和EnumType.STRING,我认为这不是一个好主意。
还有另一个问题。如何使用 Java 类数据填写表格?你会怎么做?请采取最好的方法。myEnums
MyEnum
PS:这是我可以提供的解决方案:
让我们假设有一个带有 和 name 的表。Java枚举,这在问题中有所描述。 表需要具有对字段的引用。如果您不同意,请评论解决方案。myEnum
code
fields
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我不喜欢任何一个,因为它不允许在数据库中有描述并从数据库请求它。
关于填充数据库。我认为编写一个脚本并不难,该脚本清除表,然后为每个Java枚举进行插入到表中。并且始终在部署阶段执行此操作。myEnum