玩!如果没有@Entity注释,框架不接受我的@MappedSuperclass

时间:2013-08-30 06:51:34

标签: java hibernate playframework

重要:请注意我正在谈论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可以帮助我避免这个问题,但事实并非如此。

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

感谢。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

很遗憾,您无法从类 MyGenericModel 调用 all()函数,因为该函数在运行时已得到增强,且仅适用于使用 @Entity注释的类

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

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