2011-08-04 98 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 { 
.... 
}