Динамически определять класс сущности и интерфейс JPA - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть требование, что на основе профиля мне нужно внедрить 2 разных класса в уровень 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();
    }

но это также заставит меня привести приведенный объект к классу. Я попытался создать родительский P для обоих классов A и B. И использовал их вместо этого, но запутался, когда вводил типы сущностей в JPARepository. Я попытался создать SimpleJPARepository, но это не сработало, поскольку в ARepository и BRepository есть переопределенные методы. Или же, Есть ли способ я могу использовать один и тот же класс сущности для 2 разных таблиц? таким образом, это может быть решено. для 1 профиля у меня разные наборы столбцов, тогда как для 2-го профиля у меня разные столбцы.

Вот как я ожидаю: возможно ли это? или как у меня сейчас дела обстоят правильно?

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

1 Ответ

1 голос
/ 09 апреля 2019

Вы можете создать утилиту метода следующим образом: 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);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...