我可以在@MappedSuperclasses上创建静态方法吗?

时间:2011-12-30 17:01:53

标签: java jpa playframework

我有一个抽象的TemporalModel类(注释为@MappedSuperclass),可以为所有扩展模型添加createdupdated个字段。我想为它添加一个getLatest()静态方法:

public static TemporalModel getLatest() {
    return find("order by created").first();
}

当我将此方法放在基类上,并通过具体类(Transaction.getLatest())调用它时,我收到错误:

  

发生UnsupportedOperationException:请注释您的JPA模型   使用@ javax.persistence.Entity注释。

我怀疑这是因为JPA实际上并不知道我正在通过基类调用此方法(Java中没有真正的静态方法继承)。

有没有其他方法可以实现此方法一次,而不是在所有实体类上重复它?

更新 - 实现此目的的一种方法(我在另一个较重的应用程序中使用)描述为heregist)。但是,在我当前的应用程序中,我不想使用存储库,我想知道是否有另一个更轻的解决方案。

2 个答案:

答案 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));
    }
}

我认为这是最好的方式。我知道这很难看,所以我很乐意做错。 :)