通過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達到預期的行爲?
因爲使用Set類型(和LinkedHashSet)在從數據庫中檢索時導致無序集合。該定義似乎並不適用,但也許適用於我在類中定義的方法(但不適用於查詢)。 – simpatico 2010-10-13 13:47:31
@simpatico:猜測,JPA使用通用類型來確定它在數據庫中的列類型。例如,Set將是一個具有UNIQUE屬性的列。我想它會假定'SortedSet'是一樣的。兩者之間的區別在於應用程序如何處理它們(未排序的Set,SortedSet排序)。 – Powerlord 2010-10-13 15:44:59
如果您希望訂單被持久化,那麼您需要使用@OrderColumn註釋作爲索引或@OrderBy註釋進行排序。此外,如果你有訂購你可能想要實現列表並使用它作爲屬性類型。在沒有完成增強功能的情況下,EclipseLink仍然不會加載您的集合類型,但是該訂單將被保留和檢索,以便在用戶訪問該屬性時允許您交換類型。 – 2010-10-14 14:32:33