我很恼火地将静态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;
}
答案 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()
看一下屏幕截图