【问题标题】:Mapping Queue collections in JPA Hibernate在 JPA Hibernate 中映射队列集合
【发布时间】:2012-04-11 11:24:23
【问题描述】:

在 JPA / hibernate 中是否可以有以下集合映射

@OneToMany(cascade={CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE},
fetch=FetchType.LAZY,mappedBy="parent")

private Deque<Child> childrens;

报错

Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements

我正在使用 JPA 2.0 和 Hibernate 3

【问题讨论】:

  • 为什么要在 JPA 对象中加入队列?我很惊讶 Hibernate 不支持 Deque,因为它是 Collection 的扩展,但你几乎可以肯定可以用 List 做任何你想做的事情。
  • @mbaydar 那里的答案似乎表明这是因为他没有使用接口,这里不是这种情况 - Deque 是一个扩展 Collection、Iterable 和 Queue 的接口。
  • javalobby.org/java/forums/m91832311.html 是一个很好的例子,说明如何使您自己的集合类型可用于 Hibernate。很可能您可以调整它以与 Deque 一起使用。

标签: java hibernate jpa-2.0


【解决方案1】:

不,JPA 不支持双端队列。在 JPA 2.0 规范中,这是通过以下方式解释的:

集合值的持久字段和属性必须在 以下集合值接口之一的条款,无论 实体类是否依附于 JavaBeans 方法 上述约定以及是否使用字段或属性访问: java.util.Collection, java.util.Set, java.util.List[3], java.util.Map. 集合实现类型可以由 在实体之前初始化字段或属性的应用程序 被持久化。一旦实体被管理(或分离), 后续访问必须通过接口类型。

我建议添加到提供所需 Deque 功能的实体方法(或将视图作为 Deque 公开到持久列表)。其他可能性是 cmets (Thor84no) 中建议的自定义集合。

【讨论】:

    【解决方案2】:

    虽然 JPA 不支持 Mikko 提到的 Deque,但您可以简单地将您的代码更新为 ArrayDeque,您应该一切顺利。

    @OneToMany(cascade={CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE},
    fetch=FetchType.LAZY,mappedBy="parent")
    
    private ArrayDeque<Child> childrens;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2011-03-20
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      相关资源
      最近更新 更多