请帮助我更好地理解该枚举类。
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'的字符串。仅字符串值将如何传递?
最佳答案
任何枚举都可以通过其名称唯一地标识。在您的情况下,这些常量名称A
和B
由Java编译器编译为static
字段,其中每个字段都包含枚举类型的实例。这样,枚举实例在整个应用程序(或更确切地说是类加载器)中是唯一的。即使在反射的情况下,也无法在任何时间点更改这些字段。
结果,Hibernate无法对枚举进行序列化,并且无法将状态更改持久化在枚举中(无论如何都应避免。)只能引用它们,这正是Hibernate所做的。 Hibernate / JPA stores enums therefore as either:
通过其常量名称(A
,B
)
按其序号(0
,1
)
后一种方法的问题在于,您不能再更改常量值的顺序而不破坏存储的值。如果在B
之前声明A
,则所有数据库表示形式都将被关闭。这很可能会破坏您的应用程序,这就是为什么建议使用第一种存储方法的原因。
从Hibernate加载值时,它将返回枚举类中名为A
或B
的字段的值。如果您的JVM实例确实在此期间重新启动,则由于这个原因,对enum字段所做的任何更改都将丢失。
如果您考虑一下,这也很有意义。任何枚举状态都是全局的,您无法保存其他状态,例如A
,并且一旦从数据库中加载两个不同的值,就无法期望它在不同的状态中被两次表示。这将破坏枚举的唯一性。