我有一个复合键如下
@Embeddable
public class TableAPrimary implements Serializable{
private Course course;
private int tableId;
}
课程是一个枚举
但是,我在数据库中的id值没有映射到枚举中的序数。
例如。我有
enum Course{
HISTORY(20), MATHS(100);
private Course(int courseId) {
id = courseId;
}
@Override
public int getId() {
return id;
}
private static final Map<Integer, Course> lookup = new HashMap<Integer, Course>();
static {
for (Course courseId : Course.values()) {
lookup.put(courseId.getId(), courseId);
}
}
public static Course getById(int id) throws IllegalArgumentException{
Course courseId = lookup.get(id);
if (courseId == null) {
throw new IllegalArgumentException("No course enum exists for Id " + id);
}
return courseId;
}
}
是否可以帮助我根据enum
custom id
设置正确的@embedded
答案 0 :(得分:1)
Hibernate不允许这样做,首先你不能在java中定义自定义序号。来自ordinal()
的javadoc;
返回此枚举常量的序数(它在其中的位置) 枚举声明,其中初始常量被赋值为序数 零)。
其次,来自hibernate文档,
Hibernate Annotations支持开箱即用的枚举类型映射 进入序数列(保存枚举序号)或基于字符串 column(保存枚举字符串表示):持久性 表示,默认为序数,可以通过 @Enumerated注释,如注释属性示例中所示。
此外,您无法使用数字命名字符串枚举,因此您也无法使用name()
。
Hibernate使用ordinal or name
来映射枚举,两者都是final
方法,因此枚举没有灵活性。
也许有一些解决方法,但我敢打赌他们不会使用@Enumerated
。
您可以做的是更新数据库值,所有20 =&gt; 0和100 =&gt; 1,然后它将使用序数或更新所有20 =&gt; HISTORY和100 =&gt; MATH,然后它将与名称一起使用。 (@Enumerated(EnumType.STRING)
)
希望我错了。