2013-03-08 93 views
1

我对将静态查找器添加到所有模型类感到恼火。来自父类的静态查找器

为什么不能够做到这一点:

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

} 
+1

不是一个解决方案,只是提示:现在大多数IDE允许创建一些动态的代码模板,我在Idea中添加了一个,它可以在单键盘快捷键按下时创建适当的查找器。 – biesior 2013-03-09 08:50:28

+0

我可以请你发布你的想法的真人模特吗? – cosmolev 2013-03-12 02:11:26

回答

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并设置表达式CLclassName()

看看截图

live template for Finder

live template variables

1

我花了一些时间来寻找一个解决方案,因为我有同样的问题,但这不是播放/ Ebean相关问题。

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

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

对于您的情况,FINDMyModel的所有子类共享。


我想你字段转换的静态方法取景器(),并创建一个“发现者池”用一个静态HashMap类/取景器,但你必须提供反正这样MyModel.finder(ValidationScript类。类),因为调用者总是超类。

太冗长...

+0

Thx用于分析。这确实不是Play的问题,我只是对其他Play开发者的做法感到好奇。 biesior的建议看起来非常好。 – cosmolev 2013-03-10 05:23:54