java - 动态识别实体类和JPA接口(interface)

标签 java spring-data-jpa

我有一个要求,根据配置文件,我需要将 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/

相关文章:

JavaFx:检查鼠标是否位于节点的子节点上

Java jsoup 链接提取

java - 如何使用apachecameljpa在数据库中插入一条记录?

java - E4 RCP 应用程序在双击事件时不响应

java - 如何将 HashMap 中的值转换为列表<String>

java - 在 Spring Data 中更新

spring - 为什么我需要 @Transactional 来保存 OneToOne 映射实体

java - 关于Spring JpaRepository方法线程安全

hibernate - Spring服务在异常后不回滚事务

Java 在给定枚举值的情况下获取枚举名称