为什么JPA映射属性不能成为LinkedHashset?

时间:2010-10-13 03:15:37

标签: eclipselink jpa-2.0

this问题的激励下,我试图改变以下内容:

 @ManyToMany(cascade={CascadeType.REMOVE, CascadeType.MERGE})
private Set<Expression> exps = new LinkedHashSet<Expression>();

为:

 @ManyToMany(cascade={CascadeType.REMOVE, CascadeType.MERGE})
    private LinkedHashSet<Expression> exps = new LinkedHashSet<Expression>();

然而,这样的举动导致:

Exception [EclipseLink-1] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.DescriptorException

异常说明:属性[exps]未声明为ValueHolderInterface类型,但其映射使用间接。 映射:org.eclipse.persistence.mappings.ManyToManyMapping [exps] 描述符:RelationalDescriptor(com.mysimpatico.memoplatform.persistence.entities.Meaning - &gt; [DatabaseTable(MEANING)])

我如何在JPA2中实现所期望的行为?

2 个答案:

答案 0 :(得分:3)

JPA中只允许使用标准接口类型作为属性类型。你为什么要改变属性的类型?使用原始定义,基础集合仍然是您的自定义类型。

答案 1 :(得分:2)

我相信如果你将fetch设置为EAGER,EclipseLink将允许你使用具体的集合类型。当关系是LAZY时,EclipseLink需要将自己的惰性集合放在值的位置。 EclipseLink定义了一个惰性List,Set和Map,但没有LinkedHashSet。

请注意,JPA规范要求使用Collection,Set,List或Map接口,不允许使用impls。如果订单很重要,您应该只使用一个列表。

从技术上讲,应该可以使用LAZY集合维护集合实现,所以请为此记录一个错误/增强。