2011-11-11 87 views
6

我想了解繼承在工作中如何工作!但尚未成功。如何從玩類框架中的超類繼承模型

所以,我有這樣的超:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
abstract class SuperClass extends Model { 
    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "SEQ_TABLE") 
    @TableGenerator(name = "SEQ_TABLE") 
    Long id; 

    int testVal; 
} 

和2繼承的類:

@Entity 
public class Sub extends SuperClass {   
    String name; 

    @Override 
    public String toString() { 
      return name; 
    } 
} 

@Entity 
public class Sub1 extends SuperClass {   
    String name; 

    @Override 
    public String toString() { 
      return name; 
    } 
} 

而且我有2個控制器,用於繼承類:

public class Subs and Sub1s extends CRUD { 

} 

應用程序啓動後,我在MySQL數據庫中爲我的模型(Sub和Sub1)接收了2個表,結構如下:id bigint(20),name varchar(255)。沒有testVal這是超類。

當我嘗試創建CRUD接口類的新對象,我收到這樣的錯誤:/app/views/tags/crud/form.html:在模板{CRUD模塊}發生 執行錯誤。引發的異常是MissingPropertyException:沒有這樣的屬性:testVal類:models.Sub。

在{模塊:污物} /app/views/tags/crud/form.html(圍繞線64) #{crud.numberField名:field.name,值:(currentObject currentObject [字段.name]:null)/}

  1. 我該如何正確生成繼承模型的MySQL表並修復錯誤?
  2. 是否有可能有一個單一的superController幾個繼承類?
+1

請注意,您使用默認訪問修飾符聲明您的字段。將其更改爲公開,以便播放PropertiesEnhaner可以完成其工作。 – sdespolit

+0

謝謝。我已經添加了對「Long id」和「int testVal」的公共訪問權限。現在我可以在CRUD界面看到testVal字段,並且可以保存模型沒有錯誤。但MySql中仍然沒有這樣的字段,所以我不能保存這個值。我相信我應該爲這個值添加一些註釋,但是什麼? – gl0om

+0

最後,我找到了解決方案:我剛剛將'@ MappedSuperclass'添加到'SuperClass'並從中刪除了'Long id'。 ** sdespolit **,如何接受您的建議添加公共訪問權限中介?我找不到任何接受按鈕。 – gl0om

回答

2

恩,感謝sdespolit,我做了一些實驗。這裏是我的本錢:

超類:

@MappedSuperclass 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class SuperClass extends Model { 
} 

繼承類:

@With({Secure.class, SuperController.class}) 
@CRUD.For(Sub.class) 
public class Subs extends CRUD { 
} 

@With({Secure.class, SuperController.class}) 
@CRUD.For(Sub1.class) 
public class Sub1s extends CRUD { 
} 

@Entity 
public class Sub extends SuperClass { 
} 

「超級控制器」 我在這樣的方式進行@ CRUD.For(子。類)用來告訴什麼類攔截它應該工作

public class SuperController extends Controller { 

    @After/Before/Whatever 
    public static void doSomething() { 
     String actionMethod = request.actionMethod; 
     Class<? extends play.db.Model> model = getControllerAnnotation(CRUD.For.class).value(); 

     List<String> allowedActions = new ArrayList<String>(); 
     allowedActions.add("show"); 
     allowedActions.add("list"); 
     allowedActions.add("blank"); 

     if (allowedActions.contains(actionMethod)) { 
      List<SuperClass> list = play.db.jpa.JPQL.instance.find(model.getSimpleName()).fetch(); 
     } 
    } 
} 

我不知道DoSomething的()的做法是真正的好和Java風格/播放!風格。但它適用於我。 請告訴我是否有可能以更原生的方式瞭解模型的課程。

1

「並且每個類的表是JPA規範的可選功能,因此並非所有提供者都可以支持它」從WikiBook

爲什麼不使用@MappedSuperclass?此外,你應該擴展GenericModel。在你的例子中,你定義了兩次id,這也可能是你問題的原因。