簡體   English   中英

動態識別實體類和JPA接口

[英]Dynamically Identify entity class and JPA Interface

我有一個要求,基於配置文件,我需要將2個不同的類注入DAO層以執行CRUD操作。 假設我們分別為配置文件a和b具有A類和B類。 現在在DAO層中不使用其他條件(因為我正在使用當前基於概要文件的條件,因此我正在使用服務層來調用2個不同的方法1.saveA(),2.saveB()。)但是有什么辦法使它更通用,並基於配置文件或通過類引用,我可以實例化不同的實體以及JPA類? 我嘗試使用

<T extends Parent> T factoryMethod(Class<T> clazz) throws Exception {
        return (T) clazz.newInstance();
    }

但這也將迫使我將返回的對象強制轉換為類。 我嘗試為類A和類B創建一個父P,並改為使用它們,但是在將實體類型注入JPARepository時感到困惑。 我嘗試創建一個SimpleJPARepository,但是沒有用,因為ARepository和BRepository中有重寫的方法。 或者,有沒有一種方法可以將相同的實體類用於2個不同的表? 這樣就可以解決。 對於1個配置文件,我具有不同的列集,而對於第二個配置文件,我具有不同的列。

這就是我的期望:可能嗎? 或者,我現在的做法是正確的嗎?

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);
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM