2011-08-04 123 views
4

我在當前版本中使用Play框架,我的模型類擴展了play.db.jpa.JPABase。泛型和播放框架

今天我試着做一個常用的查詢類型,並定義一個靜態幫助方法來構造它。

我寫了下面:

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.

我調試到方法,在運行時牛逼似乎是正確設置它的相應的模型類。我甚至看到了註釋。

我懷疑有些職業球員會爲此負責,但我並不完全確定。

任何想法?

更新:根據要求

加入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實體應該擴展play.db.jpa.Model並使用@Entity註解(類級別)。

對於你所說的我理解你在擴展play.db.jpa.JPABase。

這可能是問題的原因,因爲Play(就像您指出的那樣)動態增強類,並且可能與您的繼承衝突。

編輯:我測試的問題

的問題是,遊戲是不是增強了對象T.這意味着find方法叫做id GenericModel(型號的母公司),其實現是拋出一個異常的一個與消息。

增強器似乎只用@Entity檢測類。

即使mericano1的解決方案不起作用,增強器不會選擇它。所以我覺得你將無法在Play中使用該方法。

+0

我改變了類型參數,你看到了什麼上面,這個問題似乎仍然存在。我正在查詢的實體被正確註釋,「正常」查詢作品沒問題。 – 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 { 
.... 
}