2011-11-11 57 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,这也可能是你问题的原因。