【问题标题】:Why cannot a JPA mapping attribute be a LinkedHashset?为什么 JPA 映射属性不能是 LinkedHashset?
【发布时间】:2010-10-13 03:15:36
【问题描述】:

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 --> [DatabaseTable(MEANING)])

我应该如何在 JPA2 中实现所需的行为?

【问题讨论】:

    标签: eclipselink jpa-2.0


    【解决方案1】:

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

    【讨论】:

    • 因为使用 Set 类型(和 LinkedHashSet)在从数据库中检索时会导致无序集。该定义似乎不适用,但可能适用于我在类中定义的方法(但不适用于查询)。
    • @simpatico:猜测一下,JPA 使用泛型类型来确定它在数据库中的列类型。例如,一个 Set 将是一个具有 UNIQUE 属性的列。我想它会假设SortedSet 相同。两者之间的区别在于应用程序如何处理它们(对于 Set 未排序,对于 SortedSet 已排序)。
    • 如果您希望订单被持久化,那么您将需要使用@OrderColumn 注释进行索引或使用@OrderBy 注释进行排序。此外,如果您有订单,您可能希望实现 List 并将其用作属性类型。 EclipseLink 仍然不会在未完成增强的情况下加载您的集合类型,但订单将被保留并检索,允许您在用户访问该属性时交换您的类型。
    【解决方案2】:

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

    请注意,JPA 规范要求使用 Collection、Set、List 或 Map 接口,不允许使用 impl。如果顺序很重要,您应该只使用列表。

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

    【讨论】:

      猜你喜欢
      • 2012-03-07
      • 2021-08-13
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2010-11-24
      • 2012-04-05
      相关资源
      最近更新 更多