OrderColumn 注释在 Set 属性上不受支持

在 OpenJPA 中,虽然 Set 接口不保证顺序,但仍允许类型为 java.util.Set 的属性上带有 OrderColumn 注释的实体类。EclipseLink 更为严格,它仅允许类型为 java.util.List 的属性上有 OrderColumn 注释。

该规则标记在属性上发现的实现以下接口的 @OrderColumn 注释:

虽然 SortedSetSet 的子接口)通过其 Comparable 提供了排序,但它不受 EclipseLink 支持。

根据保留集合排序的重要性,有两种方法可解决该问题。

在以下实体类中,该规则将标记两个 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 指南。