在hibernate中使用@embedded中的自定义序数枚举

时间:2014-09-26 18:01:38

标签: hibernate

我有一个复合键如下

@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

1 个答案:

答案 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)

希望我错了。