如何使用通用存储库包装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方法..
希望有帮助……