我有一个模型对象,它实际上是一个带有字段和 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 加载它们?
最佳答案
我想说这种方法存在一些误解:
实体表示可以存储在数据库中的对象。在这种情况下,数据库(或任何其他持久存储)定义哪些实例可用。
枚举表示在源代码中定义的一组固定常量。因此,类本身定义了哪些常量可用。此外,更改枚举的值(即您的案例中的名称或 id)通常是不好的做法。
您会发现它们是两个完全不同的概念,应该区别对待。
要将枚举存储在实体中(其中枚举是该实体的字段),您可以使用 @Enumerated 并存储枚举的名称或序号,或者(我们更经常做的事情) )存储其中一个字段(我们大多使用id)并提供转换方法。
如果您想在数据库中存储可配置的“常量”,您可以尝试使用普通实体,将构造函数设置为私有(private)(Hibernate 和其他 JPA 提供程序应该能够处理该问题)并提供该对象的替代实现Enum
类(但不能使用 enum
关键字)。
关于java - 从数据库读取 ENUM 及其字段 (JPA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5596518/