2013-03-08 75 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