根據 JPA 2.1 規格,使用內容存取時,內容 accessor 方法必須是 public 或 protected。OpenJPA 會忽略任何專用的 accessor 方法,而 EclipseLink 則會持續保存這些屬性。如果要在 EclipseLink 中忽略專用的 accessor 方法,該方法必須有 Transient 註釋。
此規則會標示專用 accessor getter 方法。此規則的快速修正程式會將 javax.persistence.Transient 註釋新增至方法中,使得應用程式在 EclipseLink 中的行為與使用 OpenJPA 中一樣。
如果要持續保存屬性,請不要執行快速修正程式,而改為將 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 至 EclipseLink JPA 移轉:對映手冊。