2014-09-01 54 views
2

我目前正在Ubuntu上使用Play Framework 2.2.2編寫一個新的Java項目。我試圖建立一個非常簡單的類層次結構,它允許不同的db-persistable元素從一個公共BaseEntity類繼承公共字段,例如id,created_at,deleted_at等,以避免重寫相同的鍋爐板。Java中的EBean - 使用@MappedSuperclass繼承

我正在使用的例子看起來像這樣。

@Entity 
public class User extends BaseEntity { 

    @Id 
    public int id; 

    @Constraints.Required 
    public String email; 

    @Constraints.Required 
    public IUser.Status status; 

    public String activationCode; 

    public User() 
    { 
    ... 
    } 
} 

爲了實驗我創建了一個簡單的基類,它帶有一個新的屬性name。這種精細編譯:

@MappedSuperclass 
public abstract class BaseEntity extends Model { 

    protected String name; 

    public String getName() 
    { 
    return this.name; 
    } 
    public void setName(String value) 
    { 
    this.name = value; 
    } 

    public BaseEntity() 
    { 

    } 
} 

現在,當BaseEntity類不包含名稱字段或GETSET-ERS,EBean可以成功地將實體保存到數據庫。一旦我將該字段添加到getter和setter中,試圖保存實體Play時發生崩潰,但發生以下異常:

java.lang.NoSuchMethodError:models.User._ebean_getni_name()Ljava/lang/String; 在models.User._ebean_getField(User.java:1) 在com.avaje.ebeaninternal.server.reflect.EnhanceBeanReflect $ Getter.get(EnhanceBeanReflect.java:162).....

卸下GETSET或將它們移動到基類導致相同的異常。我已經很不知疲倦地上網瞭解我做錯了什麼的例子,但沒有發現任何修復它的東西。我相信這很簡單。誰能幫忙?

問候。

回答

2

這適用於我。我沒有使用getters或setter。我在Play 2.2上開發它,現在它運行在2.3。爲了清晰起見,我刪除了大部分字段這可能是因爲您的名稱字段被標記爲受保護的?

@MappedSuperclass 
public abstract class Member extends Model { 

    @Id 
    public Long id; 
    public String businessName; 
    public String webAddress; 
.. 
} 

@Entity 
public class Supplier extends Member { 

    public int minimumNoticeInHours; 
    public int maximumNoticeInDays; 
.. 
} 
+0

謝謝,我認爲這可能與編譯問題有關 - 當我手動添加它缺少的屬性時, _ebean_getni_name它編譯得很好。我認爲這些是爲了自動生成的屬性,由於某些原因,不能爲基類正確生成。訪問修飾符沒有區別。已經轉向更簡單,更少問題的ORM了! – mistakenot 2014-10-06 21:03:27