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é.
Set par List.OrderColumn.
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.