【问题标题】:Using enum as id使用枚举作为 id
【发布时间】:2011-04-12 16:10:47
【问题描述】:

使用 JPA,我们可以将枚举定义为实体的 id 吗?

我尝试了以下方法:

public enum AssetType {
   ....
}

@Entity
@IdClass(AssetType.class)
public class Adkeys {

   private AssetType type;

   @Id
   @Enumerated(EnumType.STRING)
   @Column(nullable = false)
   public AssetType getType() {
      return type;
   }

}

使用 OpenJPA,它抱怨:

org.apache.openjpa.persistence.ArgumentException:由类型“class aa.Adkeys”指定的 id 类“class aa.AssetType”没有公共的无参数构造函数。

所以我的问题是:

  • 我们应该能够使用枚举作为 JPA 上实体的 id 吗? (即 OpenJPA 中存在错误)
  • 还是我在某处犯了错误?
  • 是否有解决此类问题的方法?

【问题讨论】:

  • @Nathan:那么它一定是一个错误。

标签: java jpa openjpa


【解决方案1】:

JPA 规范没有说这是可能的:

2.1.4 主键和实体标识

主键(或复合主键的字段或属性)应该是以下类型之一:任何 Java 原始类型;任何原始包装类型; java.lang.String; java.util.日期; java.sql.日期。然而,一般来说,近似数字类型(例如,浮点类型)不应该在主键中使用。主键使用非这些类型的实体将不可移植。

如果您确实希望给定实体在编译时拥有固定数量的记录,您可以使用Stringint 主键并将其分配给AssetType.FOO.name()AssetType.FOO.ordinal()

这里的不可移植意味着一些持久性提供者可能支持其他东西,但它可能不适用于另一个提供者。与枚举一样 - 如果持久性提供程序对它有特殊支持,它不会尝试实例化它,而是在检查 class.isEnum() 后对其进行特殊处理,那么它可能会起作用。但是您的持久性提供程序似乎没有这样做。

【讨论】:

  • 它没有说这是可能的,但也没有说这是不可能的。它只是说:'主键使用非这些类型的实体将不可移植'。其实也不是说一个类可以作为主键,但是是可以的。
  • 那是另一回事 - 一个可嵌入的 id。请参阅我对可移植性部分的更新。
  • 所以我想这是一个有效的增强请求,你不觉得吗?
  • @Enumerated(EnumType.STRING) 这是否意味着该列被保留为字符串值?是的,所以应该可以将它用作@Id 列。也有表中条目不多的情况,需要通过字符串来引用。 Numeric Id是最常用的方式,但其他数据类型用对了也不会错!
  • 添加指向事实来源的链接会有所帮助。
【解决方案2】:

不,您不能使用枚举作为 ID,因为 JPA 不允许为 ID 列定义您自己的映射(它们必须是 intlong 或 JPA 可以使用 new 创建的东西)。

ID 不能是业务密钥(在您的情况下:类型)。使用业务密钥作为 ID 是 DB 设计中的常见错误,应该避免,因为它会导致以后出现各种问题。

添加独立的ID列解决问题。

【讨论】:

  • 我正在使用旧数据库。它可能不是好的设计,但它就在那里。枚举只是一堆刚性值。
【解决方案3】:

你真的想这样做吗?此构造不允许更改数据库枚举键而不更新代码中的枚举(加载失败),也不允许相反(约束失败)。为什么不直接创建一个带有 int pk 和 name 的 AssetType 表,并让 Adkeys 有一个 AssetType.id 作为 pk 的外键?

如果您需要在应用中枚举它们,您可以在启动时从数据库加载 AssetType。

【讨论】:

  • 我正在使用旧数据库。当然我可以改变它,但它可能是有问题的。枚举只是一堆刚性值。
【解决方案4】:

OpenJPA 是唯一不支持此功能的 JPA 提供程序。 见Support Enum as Primary Key Type

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2019-12-02
    • 1970-01-01
    • 2022-08-15
    相关资源
    最近更新 更多