#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`. Я обновил ответ.