2010-10-13 39 views
1

通過this問題的啓發,我試圖改變如下:爲什麼JPA映射屬性不能成爲LinkedHashset?

@ManyToMany(cascade={CascadeType.REMOVE, CascadeType.MERGE}) 
private Set<Expression> exps = new LinkedHashSet<Expression>(); 

到:

Exception [EclipseLink-1] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.DescriptorException 

異常說明:

@ManyToMany(cascade={CascadeType.REMOVE, CascadeType.MERGE}) 
    private LinkedHashSet<Expression> exps = new LinkedHashSet<Expression>(); 

然而,這樣的舉動的結果:屬性[exps]沒有聲明爲ValueHolderInterface類型,但其映射使用間接。 映射:org.eclipse.persistence.mappings.ManyToManyMapping [EXPS] 描述:RelationalDescriptor(com.mysimpatico.memoplatform.persistence.entities.Meaning - > [DatabaseTable(意)])

我如何在應該JPA2達到預期的行爲?

回答

3

只有標準接口類型被允許作爲JPA中的屬性類型。你爲什麼要改變屬性的類型?對於原始定義,底層集合仍然是您的自定義類型。

+0

因爲使用Set類型(和LinkedHashSet)在從數據庫中檢索時導致無序集合。該定義似乎並不適用,但也許適用於我在類中定義的方法(但不適用於查詢)。 – simpatico 2010-10-13 13:47:31

+0

@simpatico:猜測,JPA使用通用類型來確定它在數據庫中的列類型。例如,Set將是一個具有UNIQUE屬性的列。我想它會假定'SortedSet'是一樣的。兩者之間的區別在於應用程序如何處理它們(未排序的Set,SortedSet排序)。 – Powerlord 2010-10-13 15:44:59

+2

如果您希望訂單被持久化,那麼您需要使用@OrderColumn註釋作爲索引或@OrderBy註釋進行排序。此外,如果你有訂購你可能想要實現列表並使用它作爲屬性類型。在沒有完成增強功能的情況下,EclipseLink仍然不會加載您的集合類型,但是該訂單將被保留和檢索,以便在用戶訪問該屬性時允許您交換類型。 – 2010-10-14 14:32:33

2

我相信EclipseLink將允許您使用具體的集合類型,如果您設置提取到EAGER。當關系緩慢時,EclipseLink需要將自己的懶惰集合代替值。 EclipseLink定義了一個懶惰的List,Set和Map,但沒有LinkedHashSet。

注意JPA規範要求使用Collection,Set,List或Map接口,不允許使用impls。如果訂單很重要,您應該只使用一個列表。

從技術上講,應該可以用LAZY集合維護集合的實現,所以請爲此記錄一個bug /增強。