【问题标题】:JPA (Eclipselink) ElementCollection with Enum带有枚举的 JPA (Eclipselink) ElementCollection
【发布时间】:2013-07-12 17:10:40
【问题描述】:

我想将选定枚举的列表添加到我的一个 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”的对象,它作为整数(默认行为)写入数据库,不应以 String 转换为 枚举(因为对象已经是一个枚举)。

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

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

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

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

谁能帮忙,在 JPA @ElementCollections 中使用枚举?这是一个错误还是我错过了什么?

谢谢!

【问题讨论】:

    标签: jakarta-ee jpa eclipselink


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨,詹姆斯,感谢您的回复。我进行了很多调查并试图解决这个问题(尝试了不同的版本和库)。最后,我发现我在 JSF 而不是 JPA 上苦苦挣扎。问题是 JSF 不能自动转换 Enums(你需要一个转换器):stackoverflow.com/questions/5340762/…
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多