0

我想将选定枚举的列表添加到我的 JPA 实体之一:

@Entity
public class FooEntity {
    ...
    List<SecurityType> securityTypes;

    @ElementCollection(targetClass = SecurityType.class)
    public List<SecurityType> getSecurityTypes() {
        return securityTypes;
    }

    public void setSecurityTypes(List<SecurityType> securityTypes) {
        this.emum1s = securityTypes;
    }
    ...
}

使用枚举

public enum SecurityType {
    FOO, BAR
}

我已根据 JPA 的默认行为将数据模型添加到我的数据库中。

不幸的是,我在将这种类型的对象保存到数据库时收到了一个异常:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum
at org.eclipse.persistence.mappings.converters.EnumTypeConverter.convertObjectValueToDataValue(EnumTypeConverter.java:160)
at org.eclipse.persistence.mappings.DirectCollectionMapping.postInsert(DirectCollectionMapping.java:2209)
at org.eclipse.persistence.descriptors.DescriptorQueryManager.postInsert(DescriptorQueryManager.java:980)
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:480)

如您所见,异常来自 JPA。我有点惊讶,因为我确实有一个枚举类型“SecurityType”的对象,它作为整数(默认行为)写入数据库,它不应该以字符串转换为枚举结束(因为该对象已经是一个枚举)。

我开始调试,发现自动生成的 JPA-proxy 对象不包含属性List<Enum1>,而是List<String>

NetBeans 的调试信息

对我来说,这看起来像一个错误,我发现了一个描述该主题的问题:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=328371

我用默认的 Glassfish 3.1.2.2 (Eclipselink 1.3) 和 Eclipselink 1.4 尝试了这个。两者都一样。

任何人都可以帮忙,在 JPA @ElementCollections 中使用枚举吗?这是一个错误还是我错过了什么?

谢谢!

4

2 回答 2

0

没有 1.3 或 1.4 版本,您的意思是 2.4 吗?2.5 中的最新版本,因此您可能想尝试一下。

EclipseLink 不会自动生成代理,因此您正在查看您定义的类。检查您是否编译/部署了您的代码,它曾经是一个字符串吗?

您是如何构建要插入的对象的?检查您是否没有将字符串添加到集合中,看来您是。

于 2013-07-15T14:44:44.083 回答
0

除了您的@ElementCollection(fetch = FetchType.EAGER)注释之外,@Enumerated(EnumType.String)还使用一个@CollectionTable(指向映射表的名称并包含一个 joinColumn)和一个@ColumnSecurityType为您的表指定列的名称FooEntity

于 2020-01-28T16:08:34.250 回答