我有一个要求,根据配置文件,我需要将 2 个不同的类注入(inject) DAO 层来执行 CRUD 操作。假设配置文件 a 和 b 分别为 A 类和 B 类。现在在 DAO 层中不使用 if else 条件(因为我当前基于配置文件使用该条件,所以我使用服务层调用 2 个不同的方法 1.saveA()、2.saveB()。)但是有什么办法为了使其更加通用并基于配置文件或通过类引用,我可以实例化不同的实体以及 JPA 类吗?我尝试使用
<T extends Parent> T factoryMethod(Class<T> clazz) throws Exception {
return (T) clazz.newInstance();
}
但这也会迫使我将返回的对象强制转换为一个类。我尝试为 A 类和 B 类创建一个父 P,并使用它们来代替,但在将实体类型注入(inject)到 JPARepository 时感到困惑。 我尝试创建 SimpleJPARepository 但没有成功,因为 ARepository 和 BRepository 中有重写的方法。 或者, 有没有办法可以对两个不同的表使用相同的实体类?这样就可以解决了。对于第一个配置文件,我有不同的列集,而对于第二个配置文件,我有不同的列。
这就是我的期望:这可能吗?或者说,我现在的做法是正确的吗?
public void doStuff(Class<T> class){
GenericRepository repo;
if(class instanceof A){
//use ARepository;
repo = applicationContext.getBean(ARepository);
}else{
//use BRepository;
repo = applicationContext.getBean(BRepository);
}
repo.save(class);
repo.flush();
}
最佳答案
您可以创建如下所示的方法实用程序:key
是实体的类类型,value
是存储库。
Map<Class<? extends Parent>, JpaRepository> repoMapping = new HashMap<>();
@PostConstruct
public void init(){
repoMapping.put(A.class, applicationContext.getBean(ARepository));
repoMapping.put(B.class, applicationContext.getBean(BRepository));
}
public JpaRepository getRepo(Class<? extends Parent> classs){
return repoMapping.get(classs);
}
关于java - 动态识别实体类和JPA接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55588179/