在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中实现所期望的行为?
答案 0 :(得分:3)
JPA中只允许使用标准接口类型作为属性类型。你为什么要改变属性的类型?使用原始定义,基础集合仍然是您的自定义类型。
答案 1 :(得分:2)
我相信如果你将fetch设置为EAGER,EclipseLink将允许你使用具体的集合类型。当关系是LAZY时,EclipseLink需要将自己的惰性集合放在值的位置。 EclipseLink定义了一个惰性List,Set和Map,但没有LinkedHashSet。
请注意,JPA规范要求使用Collection,Set,List或Map接口,不允许使用impls。如果订单很重要,您应该只使用一个列表。
从技术上讲,应该可以使用LAZY集合维护集合实现,所以请为此记录一个错误/增强。