2012-04-11 165 views
3

是否有可能具有以下在JPA集合映射/休眠在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

+1

你看这个http://stackoverflow.com/questions/8169196/illegal-attempt-to-map-a-non-collection-as-a-onetomany-manytomany-or-collec。 – mbaydar 2012-04-11 11:34:12

+0

为什么你想在JPA对象中有一个队列?我很惊讶Hibernate不支持Deque,因为它是Collection的扩展,但是你几乎可以肯定能够做任何你想做的事情,而不是使用List。 – Thor84no 2012-04-11 11:37:25

+0

@mbaydar这里的答案似乎表明这是因为他没有使用接口,这里不是这种情况--Deque是一个扩展了Collection,Iterable和Queue的接口。 – Thor84no 2012-04-11 11:39:23

回答

6

不,JPA不支持Deque。在JPA 2.0规范是这样解释如下方式:

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

我会建议添加到提供所需Deque功能的实体方法(或将视图作为Deque展现给持久列表)。其他可能性是定制收集(Thor84no)。

0

虽然JPA不支持Mikko提到的Deque,但您可以简单地将您的代码更新为ArrayDeque,并且您应该很好。

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

private ArrayDeque<Child> childrens;