Adnotacje OrderColumn nie są obsługiwane w atrybutach Set

W produkcie OpenJPA klasa jednostki z adnotacją OrderColumn w atrybucie typu java.util.Set jest dozwolona, mimo że interfejs Set nie gwarantuje kolejności. Produkt EclipseLink wymaga większej dokładności i zezwala na adnotację OrderColumn tylko w atrybutach typu java.util.List.

Ta reguła powoduje oznaczenie flagą adnotacji @OrderColumn znalezionych w atrybutach, które implementują następujące interfejsy:

Chociaż podinterfejs SortedSet interfejsu Set udostępnia porządkowanie ze swoim interfejsem Comparable, nie jest ono obsługiwane przez produkt EclipseLink.

Ten problem można rozwiązać na dwa sposoby, w zależności od tego, jak ważne jest zachowanie uporządkowania kolekcji.

W następującej klasie jednostki obie adnotacje OrderColumn są oznaczone flagą przez tę regułę.

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

W poniższym przykładzie przedstawiono implementację obu możliwych rozwiązań.

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;
 
    // Usuń adnotację OrderColumn
    @ElementCollection
    private Set<String> setOfStrings = new HashSet<String>();
    
    // Zmień kolekcję w listę
    @OneToMany
    @OrderColumn
    private List<RelatedObject> setOfObjects = new ArrayList<RelatedObject>();
}

Informacje na ten temat oraz na temat innych problemów z migracją interfejsu OpenJPA do interfejsu EclipseLink zawiera podręcznik Migracja interfejsu JPA ze środowiska OpenJPA do EclipseLink: Odwzorowania.