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;

}
4

2 回答 2

1

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

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

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

在您的情况下,字段FINDMyModel的所有子类共享。


我试图在静态方法 finder() 中转换您的字段并使用静态哈希图类/查找器创建一个“查找器池”,但无论如何您必须提供这样的类 MyModel.finder(ValidationScript.class) 因为调用者总是超类。

太啰嗦了...

于 2013-03-09T23:50:34.193 回答
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()

看看截图

Finder 的实时模板

实时模板变量

于 2013-03-12T04:22:49.593 回答