2011-08-04 16 views
4

私は現在のバージョンでPlay Frameworkを使用しています。私のモデルクラスはplay.db.jpa.JPABaseを拡張しています。GenericsとPlay Framework

今日、私は頻繁に使用されるタイプのクエリジェネリックを作成し、それを構築するための静的ヘルパーメソッドを定義しようとしました。

私は次のように書いた:

import play.db.jpa.Model; 
import play.libs.F; 

public class GenericQueries { 

    public static <T extends Model> F.Option<T> firstOption(
      Class<T> clazz, 
      String query, 
      Object... parameters){ 

    final T queryResult = T.find(query,parameters).first(); 

    return (queryResult == null) ? 
      F.Option.<T>None() : 
      F.Option.Some(queryResult); 
    } 
} 

しかし、私は次のエラーを取得する:

Execution exception

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

私は、ランタイム・Tで、メソッドにデバッグ、それはモデルクラスを対応だと正しく設定されているようです。私は注釈も見ます。

私は、これを担当している遊戯人によっていくつかのクラス強化ブードゥーを疑っていますが、私は完全にはわかりません。

アイデア?

更新:追加Modelクラスここ

を要求したとして、私が使用してモデルクラスのいずれかの短縮バージョンです。

package models; 

import org.apache.commons.lang.builder.ToStringBuilder; 
import play.data.validation.Required; 
import play.db.jpa.Model; 
import play.modules.search.Field; 
import play.modules.search.Indexed; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import java.util.Date; 

@Entity @Indexed 
public class FooUser extends Model { 

    @Required 
    public Date firstLogin; 

    @Field 
    @Required(message = "needs a username") 
    @Column(unique = false,updatable = true) 
    public String name; 

    @Field 
    public String description; 

    @Required 
    public boolean isAdmin; 

    @Override 
    public String toString(){ 
    return new ToStringBuilder(this) 
      .append("name", name) 
      .append("admin", isAdmin) 
      .toString(); 
    } 
} 

答えて

6

再生エンティティでは、play.db.jpa.Modelを拡張し、@Entityアノテーション(クラスレベル)を使用する必要があります。

私はあなたがplay.db.jpa.JPABaseを拡張していることを理解しています。

これは、プレイ(あなたの指摘どおり)がクラスを動的に強化し、継承と衝突する可能性があるため、これが原因である可能性があります。

編集:私はこの問題は、そのプレイは、これは、オブジェクトTを強化されていないです

問題をテストしているfind法と呼ばれるIDの実装例外をスローすることですGenericModel(モデルの親)の1メッセージとともに。

エンハンサーは@Entityを持つクラスだけを検出するようです。

mericano1の解決法でさえ、エンハンサーはそれを選択しません。だから私はあなたがPlayでそのメソッドを使用することができないと思う。

+0

は、私はあなたが上記を参照、問題が解消されないように見えるものにTypeパラメータを変更しました。私が照会しているエンティティには正しく注釈が付けられ、「通常の」照会は正常に機能します。 – msung

+0

問題を引き起こすエンティティのコードを追加できますか? –

+0

それをしました。上記を参照。 – msung

2

これを行う最善の方法は、play.db.jpa.Modelを拡張した基本クラスを、サブクラスで共有される静的メソッドだけで使用することです。

@Entity注釈を基本クラスに追加し、クラスフィールドは追加しません。

import play.db.jpa.Model; 
import play.libs.F; 

public class BaseModel extends Model { 

    public static <T extends Model> F.Option<T> firstOption(
      Class<T> clazz, 
      String query, 
      Object... parameters){ 

    final T queryResult = T.find(query,parameters).first(); 

    return (queryResult == null) ? 
      F.Option.<T>None() : 
      F.Option.Some(queryResult); 
    } 
} 

そして

@Entity 
public class FooUser extends BaseModel { 
.... 
}