Le annotazioni OrderColumn non sono supportate negli attributi Set

In OpenJPA, una classe entità con un'annotazione OrderColumn in un attributo di tipo java.util.Set è consentita anche se l'interfaccia Set non assicura l'ordine. EclipseLink è più restrittivo e consente un'annotazione OrderColumn sono negli attributi di tipo java.util.List.

Questa regola contrassegna le annotazioni @OrderColumn trovate negli attributi che implementano le seguenti interfacce:

Sebbene SortedSet, un'interfaccia secondaria di Set, fornisca l'ordine con l'interfaccia Comparable, non è supportata da EclipseLink.

È possibile risolvere questo problema in due modi a seconda dell'importanza di mantenere l'ordine della raccolta.

Nella seguente classe di entità, entrambe le annotazioni OrderColumn sono contrassegnate da questa regola.

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

Il seguente esempio mostra l'implementazione di entrambe le possibili soluzioni.

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

Per informazioni su questo problema e altri problemi della migrazione da OpenJPA a EclipseLink, consultare la guida OpenJPA to EclipseLink JPA Migration: Mappings.