使用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”没有公共无参数构造函数。
所以我的问题是:
- 我们应该能够使用 enum 作为 JPA 中实体的 id 吗? (即 OpenJPA 中存在错误)
- 或者我在某个地方犯了错误?
- 这个问题有什么解决方法吗?
JPA 规范并没有说这是可能的:
2.1.4 主键和实体身份
主键(或复合主键的字段或属性)应该是以下类型之一:任何 Java 原始类型;任何原始包装类型; java.lang.String; java.util.Date; java.sql.Date。然而,一般来说,近似数字类型(例如,浮点类型)不应该在主键中使用。主键使用除这些之外的类型的实体将不可移植。
如果您确实希望给定实体具有编译时固定数量的记录,则可以使用String
or int
主键并分配它AssetType.FOO.name()
or AssetType.FOO.ordinal()
这里的不可移植意味着某些持久性提供程序可能支持其他内容,但它可能不适用于其他提供程序。与枚举一样 - 如果持久性提供程序对其有特殊支持,则不会尝试实例化它,而是在检查是否存在后对其进行特殊处理class.isEnum()
,那么它可能会起作用。但您的持久性提供者似乎没有这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)