Аннотации OrderColumn не поддерживаются в атрибутах Set

В OpenJPA допускается наличие класса сущности с аннотацией OrderColumn в атрибуте типа java.util.Set, хотя интерфейс Set не гарантирует соблюдение порядка. EclipseLink накладывает более жесткие ограничения, позволяя использовать аннотацию OrderColumn только в атрибутах типа java.util.List.

Это правило отмечает аннотации @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;
 
    // удаление аннотации OrderColumn
    @ElementCollection
    private Set<String> setOfStrings = new HashSet<String>();
    
    // изменение типа коллекции на List
    @OneToMany
    @OrderColumn
    private List<RelatedObject> setOfObjects = new ArrayList<RelatedObject>();
}

Для получения дополнительной информации об этой проблеме и других проблемах, возникающих при миграции OpenJPA в EclipseLink, обратитесь к руководству Миграция OpenJPA в EclipseLink JPA: преобразования.