Adnotările OrderColumn nu sunt suportate pe atributele Set

În OpenJPA, o clasă entitate cu o adnotare OrderColumn pe un atribut de tipul java.util.Set este permis chiar deşi interfaţa Set nu garantează ordinea. EclipseLink este mai strict şi permite o adnotare OrderColumn doar pe atribute de tipul java.util.List.

Această regulă semnalează adnotările @OrderColumn găsite pentru atributele care implementează interfeţele următoare:

Deşi SortedSet, o subinterfaţă a Set, furnizează ordonarea cu interfaţa sa Comparable nu este suportată de EclipseLink.

Puteţi rezolva această problemă în două moduri în funcţie de importanţa păstrării ordinii colecţiei.

În următoarea clasă entitate, ambele adnotări OrderColumn sunt semnalate de această regulă.

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

Următorul exemplu demonstrează implementarea ambelor soluţii posibile.

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

Pentru informaţii despre această problemă şi alte probleme legate de migrarea OpenJPA la EclipseLink, vedeţi ghidul OpenJPA to EclipseLink JPA Migration: Mappings.