Set 屬性不支援 OrderColumn 註釋

在 OpenJPA 中,其允許實體類別的 java.util.Set 類型的屬性有 OrderColumn 註釋(即使 Set 介面並不會確認順序)。EclipseLink 則比較嚴格,其只允許 java.util.List 類型的屬性有 OrderColumn 註釋。

此規則會標示實作下列介面的屬性中找到的 @OrderColumn 註釋:

雖然 SortedSet (這是 Set 的子介面)會利用其 Comparable 介面提供排序,但 EclipseLink 並不支援。

根據保留集合順序的重要性,您可以透過兩種方式解決這個問題。

在下列實體類別中,此規則會標示這兩個 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 移轉:對映手冊。