2013-08-30 3 views
0

Important: veuillez noter que je parle de Play! framework version 1 (1.2.6), pas 2.xJouez! framework n'accepte pas mon @MappedSuperclass sans l'annotation @Entity

J'ai 2 entités dans mon jeu! v1 demande, comme ça:

@Entity 
@Table(name = "T_FOO") 
public class Foo extends GenericModel { 

    @Id 
    @Column(name = "NAME") 
    public String name; 

    public static List<Foo> paginate(int start, int count) { 
     return all().from(start).fetch(count); 
    } 
} 

et

@Entity 
@Table(name = "T_BAR") 
public class Bar extends GenericModel { 

    @Id 
    @Column(name = "NAME") 
    public String name; 

    public static List<Bar> paginate(int start, int count) { 
     return all().from(start).fetch(count); 
    } 
} 

Dans mon contrôleur, je peux le faire sans problème:

public static void index() { 
    List<Foo> foo = Foo.paginate(1, 5); 
    List<Bar> bar = Bar.paginate(2, 5); 
    render(foo, bar); 
} 

Comme vous pouvez le voir, ces 2 entités sont assez similaire, j'ai donc créé une super classe pour regrouper les méthodes courantes:

@MappedSuperclass 
public class MyGenericModel<T> extends GenericModel { 

    public static <T> List<T> paginate(int start, int count) { 
     return all().from(start).fetch(count); 
    } 

} 

et faire en tant que parent de mes entités, par exemple:

@Entity 
@Table(name = "T_FOO") 
public class Foo extends MyGenericModel<Foo> { 

    @Id 
    @Column(name = "NAME") 
    public String name; 

} 

Cependant, avec cette modification, je reçois l'erreur suivante lorsque je tente d'appeler Foo.paginate() méthode:

UnsupportedOperationException occured : Please annotate your JPA model with @javax.persistence.Entity annotation. 

play.exceptions.JavaExecutionException: Please annotate your JPA model with @javax.persistence.Entity annotation. 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:237) 
    at Invocation.HTTP Request(Play!) 
Caused by: java.lang.UnsupportedOperationException: Please annotate your JPA model with @javax.persistence.Entity annotation. 

Il semble que Play! veut que j'annote MyGenericModel avec l'annotation @Entity, que je ne veux pas. Je pensais que l'annotation MyGenericModel avec @MappedSuperclass m'aiderait à éviter ce problème, mais ce n'est pas le cas.

Qu'est-ce que j'ai fait de mal, et comment le faire fonctionner correctement?

Merci.

Répondre

0

Malheureusement vous ne pouvez pas appeler la fonction tous() de votre classe MyGenericModel parce que La fonction est améliorée lors de l'exécution et uniquement pour les classes annotées avec @Entity.

Une solution possible pourrait être que vous utilisiez votre propre gestionnaire d'entités pour vos requêtes.

Ou vous pourriez revenir à votre première option, il n'y avait rien de mal à cela :)

+0

Merci pour votre réponse. Juste 2 commentaires: 1. Pourquoi GenericModel (de Play! API) fonctionne-t-il alors? Il utilise les méthodes 'all()' (ainsi que les autres) 2. J'ai simplifié ma question, mais en fait j'ai 20 entités concernées, donc plusieurs copies-pâtes. – romaintaz

Questions connexes