【问题标题】:Read ENUM and its fields from a database (JPA)从数据库 (JPA) 中读取 ENUM 及其字段
【发布时间】:2011-04-08 14:23:52
【问题描述】:

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

【问题讨论】:

  • 你期望什么样的数据库表示?
  • 记录(TYPE1、TYPE2 等)已经在数据库中(它是更多应用程序使用的遗留数据库),因此有两种选择可以知道哪个记录是哪个:我可以命名常量类型 Long(存储 id 值)与标准模型对象或枚举模型对象组合。不过,我宁愿使用 ENUM 解决方案。
  • 啊!不要这样做!不要像那样滥用枚举!!!!!!!!!!!!
  • 肖恩,您能否详细说明您的“这是一种滥用”的评论?

标签: java database jpa enums


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 绝不是误解,总有一些用处。枚举通常也作为一组具有属性的行存在于表中。从概念上讲,如果有两种不同的安装(两种不同的客户,两种不同的定制),这些属性将是不同的,这在概念上是可能的。因此,Java 枚举需要与 DB 枚举同步。一组已知的枚举,不同的属性。所以从概念上讲,我看到了我可能需要的东西。事实上,一个特定的搜索把我带到了这里。我也确实理解将这些链接到的概念问题
【解决方案2】:

您是否查看过@Enumerated 注释?我从未尝试在枚举本身中使用它,但是它可以很好地将类属性绑定到枚举。

enum Type{TYPE1, TYPE2}

@Column(name="type")
@Enumerated(EnumType.STRING)
public Type getType(){return type;}
public void setType(Type t){type = t;}

【讨论】:

    【解决方案3】:

    如果 JPA 无法处理此问题,您可以将 public Type valueOf(long id) 方法添加到您的枚举类中,用作工厂来实例化表示旧表中值的枚举实例。

    【讨论】:

    • 谢谢,虽然我宁愿只使用常量。但是,问题是:JPA 可以处理这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多