Les annotations OrderColumn ne sont pas prises en charge sur les attributs Set

Dans OpenJPA, une classe entité définie avec une annotation OrderColumn sur un attribut de type java.util.Set est autorisée, même si l'interface Set ne garantit pas la réorganisation. EclipseLink est plus strict et n'autorise une annotation OrderColumn que sur les attributs de type java.util.List.

Cette règle marque les annotations @OrderColumn trouvées sur les attributs qui implémentent les interfaces suivantes :

Même si SortedSet, sous-interface de Set, fournit une fonction de réorganisation avec son interface Comparable, elle n'est pas prise en charge par EclipseLink.

Vous pouvez résoudre ce problème de deux manières, selon que l'ordre de la collection doit être conservé ou peut être ignoré.

Dans la classe entité suivante, les annotations OrderColumn sont marquées par cette règle.

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

L'exemple suivant présente l'implémentation des deux solutions possibles.

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;
 
    // Retirer l'annotation OrderColumn
    @ElementCollection
    private Set<String> setOfStrings = new HashSet<String>();
    
    // Remplacer la collection par une liste
    @OneToMany
    @OrderColumn
    private List<RelatedObject> setOfObjects = new ArrayList<RelatedObject>();
}

Pour des informations sur ce problème et d'autres problèmes de migration d'OpenJPA vers EclipseLink, voir le guide OpenJPA to EclipseLink JPA Migration: Mappings.