请帮助我更好地理解这个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值?
答案 0 :(得分:2)
任何枚举都可以通过其名称进行唯一标识。这些常量名称(在您的情况下为A
和B
)由Java编译器编译为static
字段,其中每个字段包含枚举类型的实例。这样,枚举实例在整个应用程序中是唯一的(或者更确切地说,是类加载器)。即使使用反射,也无法在任何时间点更改这些字段。
因此,Hibernate无法对枚举进行序列化,并且无法在枚举中保留状态更改(无论如何都应该避免这种更改。)它们只能被引用,这是Hibernate所做的。 Hibernate / JPA stores enums therefore as either:
A
,B
)0
,1
)后一种方法的问题在于,您不能在不破坏存储值的情况下更改常量值的顺序。如果您在B
之前声明了A
,那么您的所有数据库表示都将被切换出来。这很可能会破坏您的应用程序,这就是推荐使用第一种存储方法的原因。
当从Hibernate加载一个值时,它将返回枚举类中名为A
或B
的字段的值。如果您的JVM实例同时重启,则由于这个原因,对枚举字段的任何更改都将丢失。
如果你考虑一下,这也很有意义。任何枚举状态都是全局的,您无法为例如A
保存不同的状态,并且一旦从数据库加载两个不同的值,就会期望它在不同的状态中表示两次。这将破坏enum的独特契约。
答案 1 :(得分:0)
不会传递字符串值,只会传递成员的名称。 由于这是一个固定的成员,你总是可以通过枚举的键或索引获取值,然后获取字符串值
请参阅jpa的@Enumerated注释。