请帮助我更好地理解该枚举类。

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'

}


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

最佳答案

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

结果,Hibernate无法对枚举进行序列化,并且无法将状态更改持久化在枚举中(无论如何都应避免。)只能引用它们,这正是Hibernate所做的。 Hibernate / JPA stores enums therefore as either


通过其常量名称(AB
按其序号(01


后一种方法的问题在于,您不能再更改常量值的顺序而不破坏存储的值。如果在B之前声明A,则所有数据库表示形式都将被关闭。这很可能会破坏您的应用程序,这就是为什么建议使用第一种存储方法的原因。

从Hibernate加载值时,它将返回枚举类中名为AB的字段的值。如果您的JVM实例确实在此期间重新启动,则由于这个原因,对enum字段所做的任何更改都将丢失。

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

10-07 19:52
查看更多