2011-12-30 7 views
4

私はcreatedupdatedフィールドをすべての拡張モデルに追加する抽象的なTemporalModelクラス(@MappedSuperclassと注釈付き)を持っています。私はそれにgetLatest()静的メソッドを追加したい:私は、基本クラスでこのメソッドを置くとき@MappedSuperclassesで静的メソッドを作成できますか?

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

、および具象クラス(Transaction.getLatest())を介してそれを呼び出す、私はエラーを取得:

UnsupportedOperationException occured : Please annotate your JPA model with @javax.persistence.Entity annotation.

私はこれがJPAが実際にこのメソッドを基本クラスを通して "呼び出す"ことを知っていないからです(Javaでは実際の静的メソッド継承はありません)。

このメソッドをすべてのエンティティクラスで繰り返すのではなく、一度実装する別の方法はありますか?

更新 - (私は別の重いアプリで使用しています)、これを達成するための一つの方法は、(gisthereに記載されています。しかし、私の現在のアプリケーションでは、リポジトリを使いたくないのですが、別の、より軽い解決策があるのだろうかと思いました。

+1

私が好きなときはいつでも(DataNucleus JPAを使用して)私のJPAエンティティで静的メソッドを呼び出すことができます。 JPA(仕様)は、このフォームを実装に制限しません。使用するクラスと永続コードを定義することをお勧めします。 – DataNucleus

+0

@DataNucleus - これは、hibernateを介してPlay Frameworkのデフォルトの永続性を使用して呼び出されます。 – ripper234

+2

はい、私はあなたが使っていることを知っていますが、その下にJPAを使用しています。したがって、JPAからの制限はありません。おそらく、Hibernate、またはPlayからですが、JPAはありません – DataNucleus

答えて

2

コンストラクタと静的メソッドは決して抽象的ではありません。抽象クラス の背後にあるアイデアは、サブクラスで解決しなければならないメソッドの青写真を作成することです。私は、メソッドを作成する抽象クラスの代わりに、インタフェースTemporalModelを試すことをお勧めします。public static TemporalModel getLatest();

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

私はそれが前提の中で利用可能な最良の方法だと思います。私はそれが醜いことを知っているので、私は間違っていることをうれしく思います。 :)

関連する問題