Как унаследовать модель от суперкласса в playframework - PullRequest
6 голосов
/ 11 ноября 2011

Я пытаюсь понять, как наследование работает в игре!Но пока безуспешно.

Итак, у меня есть такой суперкласс:

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

}

После запуска приложения я получаю 2 таблицы в базе данных MySQL для моих моделей (Sub и Sub1) с такой структурой: id bigint (20), name варчар (255).Без testVal , который находится в суперклассе.

И когда я пытаюсь создать новый объект Sub класса в интерфейсе CRUD, я получаю такую ​​ошибку: Произошла ошибка выполненияв шаблоне {module: crud} /app/views/tags/crud/form.html.Возникло исключение MissingPropertyException: такого свойства нет: testVal для класса: models.Sub.

In {module: crud} /app/views/tags/crud/form.html(вокруг строки 64) # {crud.numberField name: field.name, value: (currentObject? currentObject [field.name]: null) /}

  1. Что я долженсделать, чтобы правильно генерировать таблицы MySQL для унаследованных моделей и исправить ошибку?
  2. Возможно ли иметь один суперконтроллер для нескольких унаследованных классов?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Что ж, благодаря sdespolit я провел несколько экспериментов. И вот что у меня есть:

суперкласс:

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

Унаследованный класс:

@Entity 
public class Sub extends SuperClass {
}

«Super Controller» я сделал таким образом:

@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 голос
/ 13 ноября 2011

"и таблица для класса является дополнительной функцией спецификации JPA, поэтому не все провайдеры могут ее поддерживать" из WikiBook .

Почему бы вам не использовать @MappedSuperclass? Кроме того, вы должны расширить GenericModel. В вашем примере вы дважды определили id, что также может быть причиной вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...