在 OpenJPA 中,虽然 Set 接口不保证顺序,但仍允许类型为 java.util.Set 的属性上带有 OrderColumn 注释的实体类。EclipseLink 更为严格,它仅允许类型为 java.util.List 的属性上有 OrderColumn 注释。
该规则标记在属性上发现的实现以下接口的 @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; // 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>(); } |
有关此问题和其他 OpenJPA 到 EclipseLink 迁移问题的信息,请参阅 OpenJPA to EclipseLink JPA Migration: Mappings 指南。