В OpenJPA допускается наличие класса сущности с аннотацией
OrderColumn в атрибуте типа java.util.Set, хотя
интерфейс Set не гарантирует соблюдение порядка. EclipseLink
накладывает более жесткие ограничения, позволяя использовать аннотацию
OrderColumn только в атрибутах типа java.util.List.
Это правило отмечает аннотации @OrderColumn в атрибутах, реализующих следующие интерфейсы:
Интерфейс SortedSet является субинтерфейсом Set и
обеспечивает упорядочение с помощью интерфейса Comparable, однако
он не поддерживается в EclipseLink.
Эту проблему можно решить двумя способами в зависимости от того, насколько важно обеспечивать упорядоченность коллекции.
Set на коллекцию List.OrderColumn.
В следующем классе сущности правило отметит обе аннотации OrderColumn.
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>(); } |
Следующий пример демонстрирует оба возможных решения проблемы.
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 @ElementCollection private Set<String> setOfStrings = new HashSet<String>(); // изменение типа коллекции на List @OneToMany @OrderColumn private List<RelatedObject> setOfObjects = new ArrayList<RelatedObject>(); } |
Для получения дополнительной информации об этой проблеме и других проблемах, возникающих при миграции OpenJPA в EclipseLink, обратитесь к руководству Миграция OpenJPA в EclipseLink JPA: преобразования.