如何使用通用存储库包装Play / JPA的Model类?

时间:2011-11-16 12:41:11

标签: java jpa persistence playframework repository-pattern

我不喜欢直接使用模型对象,因为这会破坏封装。相反,我更喜欢Repository Pattern

当我尝试实现一个简单的存储库

public abstract class BaseRepository<T extends Model> {
    public T findOne(String query, Object... params) {
        GenericModel.JPAQuery result = T.find(query, params);
        return result.first();
    }
}
public class UserRepository extends BaseRepository<User>{}

UserRepository repo = new UserRepository();
repo.findOne("byUsername", "test");

由于java的通用或JPA注释的工作方式,我得到了异常:

java.lang.UnsupportedOperationException: Please annotate your JPA model with 
@javax.persistence.Entity annotation.
    at play.db.jpa.GenericModel.find(GenericModel.java:269)
    at repositories.BaseRepository.findOne(BaseRepository.java:12)

有解决方法吗?

(毋庸置疑,该模型已正确注释,当我直接使用它时,说User.find("byUsername", "test").first(),效果很好。)

1 个答案:

答案 0 :(得分:2)

它不起作用,因为你正在调用静态(类)方法。

JPAEnhancer将在运行时将方法添加到您的类(User),但类型/静态方法没有多态,它将始终调用GenericModel。

尝试要做的是获取实际的参数类型

ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();
Class<?> aClass = (Class<?>) ((ParameterizedType) superclass).getActualTypeArguments()[0];

和该类的invoke方法..

希望有帮助...