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

时间:2011-04-08 14:23:53

标签: 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加载它们?

3 个答案:

答案 0 :(得分:3)

我认为这种方法存在一些误解:

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

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

  3. 你看,它们是两个完全不同的概念,应该区别对待。

    要在实体中存储枚举(枚举是该实体的字段),您可以使用@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)方法,用作工厂来实例化表示旧表中值的枚举实例。