在 OpenJPA 中,其允許實體類別的 java.util.Set 類型的屬性有 OrderColumn 註釋(即使 Set 介面並不會確認順序)。EclipseLink 則比較嚴格,其只允許 java.util.List 類型的屬性有 OrderColumn 註釋。
此規則會標示實作下列介面的屬性中找到的 @OrderColumn 註釋:
雖然 SortedSet (這是 Set 的子介面)會利用其 Comparable 介面提供排序,但 EclipseLink 並不支援。
根據保留集合順序的重要性,您可以透過兩種方式解決這個問題。
Set 集合變更為 List 集合。OrderColumn 註釋。
在下列實體類別中,此規則會標示這兩個 OrderColumn 註釋。
import java.util.HashSet; import java.util.Set; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OrderColumn; import javax.persistence.OneToMany; @Entity public class OrderColumnExampleEntity { @Id private int id; @ElementCollection @OrderColumn private Set<String> setOfStrings = new HashSet<String>(); @OneToMany @OrderColumn private Set<RelatedObject> setOfObjects = new HashSet<RelatedObject>(); } |
下例顯示實作兩種可能的解決方案。
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OrderColumn; import javax.persistence.OneToMany; @Entity public class OrderColumnExampleEntity { @Id private int id; // Remove the OrderColumn annotation @ElementCollection private Set<String> setOfStrings = new HashSet<String>(); // Change the collection to a List @OneToMany @OrderColumn private List<RelatedObject> setOfObjects = new ArrayList<RelatedObject>(); } |
如需此問題以及其他 OpenJPA 至 EclipseLink 移轉問題的相關資訊,請參閱 OpenJPA 至 EclipseLink JPA 移轉:對映手冊。