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.
Set para uma coleção List.OrderColumn.
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.