0

重要提示:请注意,我说的是 Play!框架版本 1 (1.2.6),而不是 2.x

我的 Play 中有 2 个实体!v1应用程序,像这样:

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

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

在我的控制器中,我可以毫无问题地做到这一点:

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

如您所见,这两个实体非常相似,因此我创建了一个超类来重新组合常用方法:

@MappedSuperclass
public class MyGenericModel<T> extends GenericModel {

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

}

并将其作为我的实体的父级,例如:

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

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

}

但是,通过此修改,当我尝试调用Foo.paginate()方法时出现以下错误:

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.

看来玩!想让我用注释MyGenericModel进行@Entity注释,这是我不想要的。我认为用注释MyGenericModel可以@MappedSuperclass帮助我避免这个问题,但事实并非如此。

我做错了什么,以及如何使其正常工作?

谢谢。

4

2 回答 2

0

不幸的是,您不能从MyGenericModel类中调用函数all() ,因为该函数在运行时得到了增强,并且仅适用于使用@Entity注释的类。

可能的解决方案是您使用自己的实体管理器进行查询。

或者你可以回到你的第一个选项,这没有错:)

于 2013-08-31T00:20:23.373 回答
0

不幸的是(这也是我的痛苦)Ebean 还不支持泛型:

https://groups.google.com/forum/#!searchin/ebean/generics/ebean/QWjpI0LRCiA/io-Lm_gfYE4J

于 2013-08-30T08:21:35.293 回答