JPA 2.1 仕様により、プロパティー・アクセスが使用されている場合、プロパティーの accessor メソッドは public または protected である必要があります。OpenJPA は private accessor メソッドがある場合は無視するのに対し、EclipseLink はそれらの属性を永続化します。EclipseLink で private accessor メソッドを無視するには、このメソッドは Transient アノテーションを持つ必要があります。
この規則により、private accessor getter メソッドにフラグを立てます。EclipseLink でのアプリケーションの振る舞いが OpenJPA を使用した時と同じになるように、この規則のクイック・フィックスにより javax.persistence.Transient アノテーションがメソッドに追加されます。
属性を永続化するには、クイック・フィックスを実行せず、代わりに private アクセス制御修飾子を public または protected に変更します。
例えば、この規則は以下のエンティティー・クラスの getNonPersistentField() メソッドにフラグを立てます。
package entities; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class PrivateAccessor { private int id; private int field; @Id public int getId() { return id; } public void setId(int id) { this.id = id; } private int getNonPersistentField() { return nonPersistentField; } private void setNonPersistentField(int value) { this.field = value; } } |
クイック・フィックスの実行後、Transient アノテーションが private accessor メソッドに適用され、import が追加されます。
package entities; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Transient; @Entity public class PrivateAccessor { private int id; private int field; @Id public int getId() { return id; } public void setId(int id) { this.id = id; } @Transient private int getNonPersistentField() { return nonPersistentField; } private void setNonPersistentField(int value) { this.field = value; } } |
この問題や、OpenJPA から EclipseLink へのマイグレーションに関するその他の問題については、 OpenJPA to EclipseLink JPA Migration: Mappings ガイドを参照してください。