OpenJPA では、Set インターフェースは順序を保証していなくても、java.util.Set 型の属性に OrderColumn アノテーションが付いているエンティティー・クラスが許可されます。EclipseLink はこれより厳しく、OrderColumn アノテーションは java.util.List 型の属性にのみ許可されます。
この規則により、以下のインターフェースを実装する属性で見つかった @OrderColumn アノテーションにフラグを立てます。
SortedSet (Set のサブインターフェース) は Comparable インターフェースによる順序付けを提供しますが、これは EclipseLink ではサポートされません。
この問題は、コレクションの順序を保持することの重要性に応じて 2 とおりの方法で解決できます。
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>(); // collection を List に変更 @OneToMany @OrderColumn private List<RelatedObject> setOfObjects = new ArrayList<RelatedObject>(); } |
この問題や、OpenJPA から EclipseLink へのマイグレーションに関するその他の問題については、 OpenJPA to EclipseLink JPA Migration: Mappings ガイドを参照してください。