java - 从数据库读取 ENUM 及其字段 (JPA)

标签 java database jpa enums

我有一个模型对象,它实际上是一个带有字段和 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 加载它们?

最佳答案

我想说这种方法存在一些误解:

  1. 实体表示可以存储在数据库中的对象。在这种情况下,数据库(或任何其他持久存储)定义哪些实例可用。

  2. 枚举表示在源代码中定义的一组固定常量。因此,类本身定义了哪些常量可用。此外,更改枚举的值(即您的案例中的名称或 id)通常是不好的做法。

您会发现它们是两个完全不同的概念,应该区别对待。

要将枚举存储在实体中(其中枚举是该实体的字段),您可以使用 @Enumerated 并存储枚举的名称或序号,或者(我们更经常做的事情) )存储其中一个字段(我们大多使用id)并提供转换方法。

如果您想在数据库中存储可配置的“常量”,您可以尝试使用普通实体,将构造函数设置为私有(private)(Hibernate 和其他 JPA 提供程序应该能够处理该问题)并提供该对象的替代实现Enum 类(但不能使用 enum 关键字)。

关于java - 从数据库读取 ENUM 及其字段 (JPA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5596518/

相关文章:

java - 扫描关闭会造成麻烦,所以我应该不关闭它吗?

java - 除 | 之外的所有符号的正则表达式

java - 如何从控制台启动我的应用程序作为服务器?

java - 为什么 ormlite 有自己的注释?

java - 处理无效字符常量

mysql - 如何恢复开发机上的Mysql数据库?

mysql - 如何在R中重写mysql服务器上的数据表?

android - 从数据库中获取当前 map View 的所有 GPS 坐标

java - 有什么方法可以让 JPA 更快地持久化对象吗?

java - Hibernate = 在运行时设置级联选项?