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

我不喜欢直接使用模型对象,因为这打破了封装。 相反,我更喜欢存储库模式 。

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

public abstract class BaseRepository { public T findOne(String query, Object... params) { GenericModel.JPAQuery result = T.find(query, params); return result.first(); } } public class UserRepository extends BaseRepository{} UserRepository repo = new UserRepository(); repo.findOne("byUsername", "test"); 

由于java的generics或JPA注释的工作方式,我得到了exception:

 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()运行良好)。

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

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

你可以尝试做的是获得实际的参数类型

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

和该类的invoke方法..

希望有帮助……