As anotações OrderColumn não são suportadas nos atributos Set

No OpenJPA, uma classe de entidade com uma anotação OrderColumn em um atributo do tipo java.util.Set é permitida mesmo que a interface Set não garanta a ordem. O EclipseLink é mais restrito e permite uma anotação OrderColumn apenas nos atributos do tipo java.util.List.

Esta regra sinaliza anotações @OrderColumn localizadas nos atributos que implementam as interfaces a seguir:

Embora SortedSet, uma subinterface de Set, forneça ordenamento com sua interface Comparable, ela não é suportada pelo EclipseLink.

É possível resolver este problema de duas maneiras, dependendo da importância da ordem de retenção da coleção.

Na classe de entidade a seguir, ambas as anotações OrderColumn são sinalizadas por esta regra.

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>();
}

O exemplo a seguir mostra a implementação de ambas as soluções possível.

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;
 
    // Remover a anotação OrderColumn
    @ElementCollection
    private Set<String> setOfStrings = new HashSet<String>();
    
    // Alterar a coleção para uma Lista
    @OneToMany
    @OrderColumn
    private List<RelatedObject> setOfObjects = new ArrayList<RelatedObject>();
}

Para obter informações sobre esse problema e outros problemas de migração do OpenJPA para o EclipseLink, consulte o guia Migração do OpenJPA para o EclipseLink JPA: mapeamentos.