我不喜欢直接使用模型对象,因为这会破坏封装。相反,我更喜欢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()
,效果很好。)
答案 0 :(得分:2)
它不起作用,因为你正在调用静态(类)方法。
JPAEnhancer将在运行时将方法添加到您的类(User),但类型/静态方法没有多态,它将始终调用GenericModel。
尝试要做的是获取实际的参数类型
ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();
Class<?> aClass = (Class<?>) ((ParameterizedType) superclass).getActualTypeArguments()[0];
和该类的invoke方法..
希望有帮助...