2012-04-11 122 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;