OpenJPA @PersistentCollection アノテーションは @ElementCollection および @Column に置き換えなければならない

OpenJPA は、org.apache.openjpa.persistence.PersistentCollection のアノテーションが付けられているコレクション属性に別個の表を作成します。EclipseLink で同じ動作になるようにするには、JPA 仕様の定義に従って、これらのアノテーションを @ElementCollection および @Column アノテーションに置き換えます。@PersistentCollection アノテーションを削除したが @ElementCollection および @Column アノテーションを追加しなかった場合、EclipseLink はフィールドを BLOB として扱い、エンティティーの表にデータの列を作成しようとします。

この規則は org.apache.openjpa.persistence.PersistentCollection アノテーションがないかをスキャンし、手動でマイグレーションできるようにします。 アノテーションをマイグレーションするには、以下のステップを実行します。

  1. @org.apache.openjpa.persistence.PersistentCollection アノテーションを以下に置き換えます。
    @javax.persistence.ElementCollection
    @javax.persistence.Column(name="element")
    
    属性に @Column アノテーションが既に付けられている場合は、新たにアノテーションを追加するのではなく、名前を変更してください。
  2. 配列をオブジェクトのコレクションに変更します。プリミティブの代わりに、プリミティブ・ラッパー型を使用します。

例えば、この規則により、以下のエンティティー・クラスの @PersistentCollection アノテーションにフラグを立てます。


import javax.persistence.Entity;
import javax.persistence.Id;
import org.apache.openjpa.persistence.PersistentCollection;

@Entity
public class IntArrayEntity{
    @Id
    private int id;
    
    @PersistentCollection
    private int[] arrayOfInts;

}

このエンティティーをマイグレーションするには、アノテーションを置き換え、int 配列を Integer オブジェクトのリスト List<Integer> に変更します。

import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class IntArrayEntity{
    @Id
    private int id;
    
    @ElementCollection
    @Column(name = "element")
    private List<Integer> arrayOfInts;
}

この OpenJPA から EclipseLink へのマイグレーションの問題については、 Migration from OpenJPA to EclipseLink JPA: Extended Functionality ガイドを参照してください。