gpt4 book ai didi

java - 使用枚举作为 id

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:51:52 27 4
gpt4 key购买 nike

使用 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: The id class "class aa.AssetType" specified by type "class aa.Adkeys" does not have a public no-args constructor.

所以我的问题是:

  • 我们是否可以使用枚举作为 JPA 上实体的 ID? (即 OpenJPA 中存在错误)
  • 还是我哪里弄错了?
  • 是否有解决此类问题的方法?

最佳答案

JPA 规范并未说明这是可能的:

2.1.4 Primary Keys and Entity Identity

The primary key (or field or property of a composite primary key) should be one of the following types: any Java primitive type; any primitive wrapper type; java.lang.String; java.util.Date; java.sql.Date. In general, however, approximate numeric types (e.g., floating point types) should never be used in primary keys. Entities whose primary keys use types other than these will not be portable.

如果你真的想为一个给定的实体有一个编译时固定数量的记录,你可以使用一个 Stringint 主键并分配给它 AssetType.FOO.name()AssetType.FOO.ordinal()

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

关于java - 使用枚举作为 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3717694/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com