如何从play框架中的超类继承模型

时间:2011-11-11 16:31:19

标签: java jpa playframework superclass

我试图了解继承如何发挥作用!但尚未成功。

所以,我有这样的超类:

@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界面中创建 Sub 类的新对象时,我收到了这样的错误: 模板{module:crud} /app/views/tags/crud/form.html中发生执行错误。引发的异常是 MissingPropertyException:没有这样的属性:testVal for class:models.Sub。

在{module:crud} /app/views/tags/crud/form.html(第64行) #{crud.numberField name:field.name,value:(currentObject?currentObject [field.name]:null)/}

  1. 如何正确生成继承模型的MySQL表并修复错误?
  2. 是否可以为多个继承的类设置一个superController?

2 个答案:

答案 0 :(得分:2)

好吧,多亏了 sdespolit ,我做了一些实验。这就是我所拥有的:

超类:

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

继承类:

@Entity 
public class Sub extends SuperClass {
}
我以这种方式制作的“超级控制器”:

@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 {
}

@ CRUD.For(Sub.class)用于告诉拦截器应该使用哪个类

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风格/ Play!风格。但它对我有用。 请告诉我是否有可能以更原生的方式了解模型的课程。

答案 1 :(得分:1)

&#34;每个类的表是JPA规范的可选功能,因此并非所有提供商都支持它&#34;来自WikiBook

为什么不使用@MappedSuperclass?此外,您应该扩展GenericModel。在您的示例中,您定义了两次id,这也可能是您遇到问题的原因。