父类的静态Finder

时间:2013-03-08 21:29:50

标签: playframework playframework-2.0 ebean

我很恼火地将静态Finder添加到我的所有Model类中。

为什么不能这样做:

@MappedSuperclass
public class MyModel<T> extends Model {

    public static Finder<Integer,T> FIND = new Finder<Integer, T>(Integer.class,T.class);

}

@SuppressWarnings("serial")
@Entity
public class ValidationScript extends MyModel<ValidationScript> {

    @Id
    public Integer id;

    @Column(length = 5000)
    public String scriptCode;

}

2 个答案:

答案 0 :(得分:1)

我花了一些时间来搜索解决方案,因为我遇到了同样的问题,但这不是与Play / Ebean相关的问题。

不幸的是,你不能用Java做到这一点。按照设计,所有蔗类(同一个对象!)共享一个静态字段。当然,你不能拥有多种类型的对象! 在编译时使用泛型来检查方法调用的正确性: http://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html

您使用泛型提出的解决方案无法工作,因为静态字段/方法无法访问该类型(所有实例可能具有不同的类型)。

在您的情况下, MyModel 的所有子类共享字段 FIND


我试图在静态方法finder()中转换你的字段,并创建一个带有静态hashmap类/ finder的“finder pool”,但你必须提供类似MyModel.finder(ValidationScript.class)的类,因为调用者永远是超类。

太冗长......

答案 1 :(得分:1)

模板非常简单。请使用此模板,而不是手动添加@Id字段和Finder

@javax.persistence.Id
public $ID$ id;

public static Finder<$ID$, $CL$> find
        = new Finder<$ID$, $CL$>($ID$.class, $CL$.class);

将其粘贴到模板编辑器中后,点击Edit variables并将CL的表达式设置为className()

看一下屏幕截图

live template for Finder

live template variables