Динамическая идентификация класса объектов и интерфейса JPA

#java #spring-data-jpa

#java #spring-data-jpa

Вопрос:

У меня есть требование, чтобы на основе профиля мне нужно было ввести 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:

Вы можете создать утилиту метода следующим образом: 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);
  }
  

Комментарии:

1. Adria, если я автоматически подключаю местоположение и местоположение и передаю на карту. Я получаю следующую ошибку компилятора: The method put(Class<? extends Parent>, capture#1-of ? extends JpaRepository) in the type Map<Class<? extends Parent>,capture#1-of ? extends JpaRepository> is not applicable for the arguments (Class<A>, ARepository)

2. удалите часть ? extends и попробуйте с помощью ` Map расширяет родительский>, JpaRepository`. Я обновил ответ.