我有一个模型对象,实际上是一个包含字段和getter的枚举:
@Entity
public enum Type {
TYPE1, TYPE2, TYPE3, TYPE4;
@Column
private Long id;
@Column
private String name;
...
public String getName() {
return this.name;
}
...
}
它编译并运行良好。但是,如果我调用getter方法,它将返回null(它不会加载存储在数据库中的任何值)。这是标准行为吗?有没有办法让JPA加载它们?
答案 0 :(得分:3)
我认为这种方法存在一些误解:
实体表示可以存储在数据库中的对象。在这种情况下,数据库(或任何其他持久性存储)定义哪些实例可用。
枚举代表一组固定的常量,这些常量在源代码中定义。因此,类本身定义了哪些常量可用。此外,更改枚举值(即您的案例中的名称或ID)通常是不好的做法。
你看,它们是两个完全不同的概念,应该区别对待。
要在实体中存储枚举(枚举是该实体的字段),您可以使用@Enumerated
并存储枚举的名称或序号,或者(我们经常做的)存储其中一个字段(我们主要使用id)并提供转换方法。
如果要在数据库中存储可配置的“常量”,可以尝试使用普通实体,使构造函数成为私有(Hibernate和其他JPA提供者应该能够处理它)并提供替代实现Enum
类{但您不能使用enum
关键字。
答案 1 :(得分:1)
您是否查看了@Enumerated注释?我从来没有试过在枚举本身中使用它,但它可以很好地将类属性绑定到枚举。
enum Type{TYPE1, TYPE2}
@Column(name="type")
@Enumerated(EnumType.STRING)
public Type getType(){return type;}
public void setType(Type t){type = t;}
答案 2 :(得分:0)
如果无法对JPA进行处理,可以在枚举类中添加public Type valueOf(long id)
方法,用作工厂来实例化表示旧表中值的枚举实例。