In OpenJPA ist eine Entitätsklasse mit einer Annotation OrderColumn in einem Attribut des Typs
java.util.Set auch dann zulässig, wenn die Set-Schnittstelle die Reihenfolge nicht gewährleistet.
EclipseLink ist strikter und lässt eine Annotation OrderColumn nur in Attributen des Typs
java.util.List zu.
Diese Regel markiert @OrderColumn-Annotationen in Attributen, die die folgenden Schnittstellen implementieren:
Obwohl SortedSet, eine untergeordnete Schnittstelle von Set, die Einhaltung der Reihenfolge mit ihrer
Schnittstelle Comparable ermöglicht, wird diese von EclipseLink nicht unterstützt.
Für die Lösung dieses Problems stehen Ihnen je nach Bedeutung, die die Einhaltung der Reihenfolge in der Collection, zwei Möglichkeiten zur Verfügung.
Set-Collection
in eine List-Collection.OrderColumn.
In der folgenden Entitätsklasse werden beide OrderColumn-Annotationen von dieser Regel markiert.
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>(); } |
Das folgende folgen veranschaulicht die Implementierung der beiden möglichen Lösungen.
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; // OrderColumn-Annotation entfernen @ElementCollection private Set<String> setOfStrings = new HashSet<String>(); // Collection in eine List-Collection ändern @OneToMany @OrderColumn private List<RelatedObject> setOfObjects = new ArrayList<RelatedObject>(); } |
Informationen zu diesem Problem und zu weiteren Problemen bei der Migration von OpenJPA auf EclipseLink finden Sie in der Veröffentlichung OpenJPA to EclipseLink JPA Migration: Mappings.