我有一个抽象的TemporalModel类(注释为@MappedSuperclass
),可以为所有扩展模型添加created
和updated
个字段。我想为它添加一个getLatest()
静态方法:
public static TemporalModel getLatest() {
return find("order by created").first();
}
当我将此方法放在基类上,并通过具体类(Transaction.getLatest()
)调用它时,我收到错误:
发生UnsupportedOperationException:请注释您的JPA模型 使用@ javax.persistence.Entity注释。
我怀疑这是因为JPA实际上并不知道我正在通过基类调用此方法(Java中没有真正的静态方法继承)。
有没有其他方法可以实现此方法一次,而不是在所有实体类上重复它?
更新 - 实现此目的的一种方法(我在另一个较重的应用程序中使用)描述为here(gist)。但是,在我当前的应用程序中,我不想使用存储库,我想知道是否有另一个更轻的解决方案。
答案 0 :(得分:2)
构造函数和静态方法永远不可能是抽象的。抽象类背后的想法 是创建方法的蓝图,必须在子类中得到解决。我建议尝试一个接口TemporalModel而不是一个抽象类,在其中你创建方法public static TemporalModel getLatest();
答案 1 :(得分:1)
我没有使用过这个Play框架,所以我不确定这里的细节,但通常情况下,当你做一些你想做的事情时,在Java中,只需指定具体类作为参数。有问题的静态方法。当然,这有点难看,但它是Java。
我假设这个find
方法是一个静态方法,通过这个框架在每个扩展类上以某种方式(通过注释处理?)添加,对吗?在这种情况下,我认为你唯一的办法是做这样的事情:
public static <T extends TemporalModel> T getLatest(Class<T> cl) {
try {
/* I don't know what type the find() method returns, so you'll have to fix the casting */
return(cl.cast(cl.getMethod("find", String.class).invoke("order by created").first()));
} catch(AllThosePeskyReflectionExceptions e) {
throw(new Error(e));
}
}
我认为这是最好的方式。我知道这很难看,所以我很乐意做错。 :)