Допустим, у нас есть три объекта JPA с именем и идентификатором.Я сделал интерфейс с getters + setters для имени и идентификатора.
class Car implements MetadataObject
class Bus implements MetadataObject
class Train implements MetadataObject
У нас также есть три репозитория для этих объектов JPA:
interface CarRepository extends CrudRepository<Car, Long>
interface BusRepository extends CrudRepository<Bus, Long>
interface TrainRepository extends CrudRepository<Train, Long>
Для каждого из этих объектов, которые мы хотим запуститьтот же метод в весенней службе.(очень упрощенно)
private void importMetadata(CrudRepository<? extends MetadataObject, String> mRepository) {
Optional<? extends MetadataObject> currentOptional = mRepository.findById(1);
if (currentOptional.isPresent()) {
MetadataObject current = (MetadataObject) currentOptional.get();
current.setName("a1");
mRepository.save(current);
}
}
, который вызывается той же пружинной службой на
@Autowired
private CarRepository carRepository;
...
importMetadata(carRepository);
Это приводит к ошибке:
The method save(S) in the type CrudRepository<capture#4-of ? extends MetadataObject, Long> is not applicable for the arguments (MetadataObject)
Что странно, еслиЯ смотрю на хранилище Springs CRUD: CrudRepository<T, ID>
и его метод сохранения: <S extends T> S save(S entity);
.
В нашем примере у нас есть T = ? extends MetadataObject
и S = ? extends ? extends MetadataObjects
.
Если мы изменим мою функцию наprivate void importMetadata(CrudRepository<MetadataObject, String> bdbRepository)
метод сохранения корректен, но я больше не могу вызывать метод с моим carRepository
The method importMetadata(CrudRepository<MetadataObject,String>) in the type <...> is not applicable for the arguments (CarRepository)
Помните: я очень упростил пример.Я знаю, что в этом примере интерфейсы для этих классов JPA не имеют смысла.Я также знаю, что мой метод не имеет смысла, но он прекрасно освещает проблему.
Мой вопрос будет таким: что передать, чтобы сохранить, или как переписать эту функцию, чтобы она работала?В чем здесь проблема?