【发布时间】:2013-04-14 22:50:46
【问题描述】:
像往常一样,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 表中,我希望有指向 myEnums 表的 myEnumCode 字段。
使用 currenlty 同时支持 EnumType.ORDINAL 和 EnumType.STRING 我想这不是一个好主意。
还有一个问题。如何使用Java MyEnum 类数据填写myEnums 表?你会怎么做?请最好的方法。
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 的替代品。我不想在这里写下它的使用可能存在的所有问题(在 Effective Java 中,它是关于序数用法的描述)。使用 EnumType.STRING 我不喜欢这两种方法,因为它不允许在数据库中有描述并从 db 请求它。
关于填充数据库。我认为编写一个脚本并不难,它清除myEnum 表,然后为每个Java 枚举实例插入表中。并且始终在部署阶段执行此操作。
【问题讨论】:
-
在数据库中存储已经在枚举本身中硬编码的值有什么意义?数据库中的数据无论如何都不会被应用程序使用,并且您最终会在数据库中的值和枚举中硬编码的值之间出现不一致。
-
我可能需要生成一些报告的sql查询,因此将值及其描述存储在db中非常方便。与序数类相比,在 Java 代码中访问枚举也有其好处。
标签: java jpa enums hibernate-mapping