2011-11-11 12 views
6

Estoy intentando comprender cómo funciona la herencia en juego. Pero sin éxito todavía.Cómo heredar un modelo de la superclase en playframework

lo tanto, tengo tales superclase:

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

y 2 clases heredadas:

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

También tengo 2 controladores para las clases heredadas:

public class Subs and Sub1s extends CRUD { 

} 

después del inicio de la aplicación , Recibo 2 tablas en MySQL db para mis modelos (Sub y Sub1) con dicha estructura: id bigint (20), nombre varchar (255). Sin testVal que está en superclase.

Y cuando intento crear nuevo objeto de la clase Sub en la interfaz CRUD que recibo dicho error: error ejecución ocurrió en la plantilla {module: crud} /app/views/tags/crud/form.html. La excepción planteada fue MissingPropertyException: Sin dicha propiedad: testVal for class: models.Sub.

En {module: crud} /app/views/tags/crud/form.html (alrededor de la línea 64) # {crud.numberField nombre: field.name, valor:? (CurrentObject currentObject [Campo .name]: null) /}

  1. ¿Qué debo hacer para generar las tablas de MySQL para los modelos heredados correctamente y corregir el error?
  2. ¿Es posible tener un supercontrolador único para varias clases heredadas?
+1

tenga en cuenta que declara sus campos con el modificador de acceso predeterminado. Cámbielo a público para que el juego PropertiesEnhaner pueda hacer su trabajo. – sdespolit

+0

Gracias. Agregué acceso público a 'Long id' y' int testVal'. Ahora puedo ver el campo testVal en la interfaz CRUD y puedo guardar el modelo sin errores. Pero aún no existe ese campo en MySql, por lo que no puedo guardar este valor. Creo que debería agregar algún tipo de anotación a este valor, pero ¿qué? – gl0om

+0

Finalmente, encontré la solución: acabo de agregar '@ MappedSuperclass' a' SuperClass' y eliminé 'Long id' de él. ** sdespolit **, ¿cómo aceptar su sugerencia de agregar un midificador de acceso público? No puedo encontrar ningún botón de aceptar. – gl0om

Respuesta

2

Bueno, gracias a sdespolit, hice algunos experimentos. Y esto es lo que tengo:

Superclase:

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

clase heredada:

@Entity 
public class Sub extends SuperClass { 
} 

"Super Controller" He hecho de tal manera:

@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.clase) se utiliza contar a los interceptores con lo que la clase que debería funcionar

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(); 
     } 
    } 
} 

No estoy seguro acerca de doSomething() enfoque es realmente agradable y Java-estilo/Play! al estilo. Pero funciona para mí. Por favor dígame si es posible ver la clase del modelo de una manera más nativa.

1

"y la tabla por clase es una característica opcional de la especificación JPA, por lo que no todos los proveedores pueden admitirla" de WikiBook.

¿Por qué no usas @MappedSuperclass? Además, debería extender GenericModel. En su ejemplo, usted definió la identificación dos veces, lo que también podría ser el motivo de su problema.

Cuestiones relacionadas