gpt4 book ai didi

java - 我如何使用通用存储库包装 Play/JPA 的模型类?

转载 作者:搜寻专家 更新时间:2023-11-01 03:28:03 24 4
gpt4 key购买 nike

我不喜欢直接使用模型对象,因为这会破坏封装。相反,我更喜欢 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() 它运行良好)。

最佳答案

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

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

您可以尝试做的是通过类似

的方式获取实际的参数类型
ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();
Class<?> aClass = (Class<?>) ((ParameterizedType) superclass).getActualTypeArguments()[0];

以及该类的调用方法..

希望对您有所帮助...

关于java - 我如何使用通用存储库包装 Play/JPA 的模型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8151864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com