Java:更好地理解枚举

时间:2014-06-25 14:34:17

标签: java hibernate enums

请帮助我更好地理解这个enum课程。

public enum TryMe {

    A("A", "Description of A"), 
    B("B", "Description of B");

    private String a;
    private String b;

    private TryMe(String a, String b) {
        this.a = a;
        this.b = b;
    }

    //Getter and Setter for 'a' and 'b'

}

当我包含在Hibernate实体类中时会发生什么?
实体类的相应数据库列需要一个值为' A'的字符串。或者' B'。
如何传递String值?

2 个答案:

答案 0 :(得分:2)

任何枚举都可以通过其名称进行唯一标识。这些常量名称(在您的情况下为AB)由Java编译器编译为static字段,其中每个字段包含枚举类型的实例。这样,枚举实例在整个应用程序中是唯一的(或者更确切地说,是类加载器)。即使使用反射,也无法在任何时间点更改这些字段。

因此,Hibernate无法对枚举进行序列化,并且无法在枚举中保留状态更改(无论如何都应该避免这种更改。)它们只能被引用,这是Hibernate所做的。 Hibernate / JPA stores enums therefore as either

  • 按其常名(AB
  • 按其序号(01

后一种方法的问题在于,您不能在不破坏存储值的情况下更改常量值的顺序。如果您在B之前声明了A,那么您的所有数据库表示都将被切换出来。这很可能会破坏您的应用程序,这就是推荐使用第一种存储方法的原因。

当从Hibernate加载一个值时,它将返回枚举类中名为AB的字段的值。如果您的JVM实例同时重启,则由于这个原因,对枚举字段的任何更改都将丢失。

如果你考虑一下,这也很有意义。任何枚举状态都是全局的,您无法为例如A保存不同的状态,并且一旦从数据库加载两个不同的值,就会期望它在不同的状态中表示两次。这将破坏enum的独特契约。

答案 1 :(得分:0)

不会传递字符串值,只会传递成员的名称。 由于这是一个固定的成员,你总是可以通过枚举的键或索引获取值,然后获取字符串值

请参阅jpa的@Enumerated注释。