Я пытаюсь обновить отношение N в отношениях 1: N (примитивное решение)
class Person{
// id etc.
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "owner", orphanRemoval=true)
private List<Car> cars;
}
class Car{
// id etc.
@ManyToOne
private Person owner;
}
// получить всех людей и преобразовать их в карту
Map<id,Person> persons = personDAO.getALL().transformToMap();
// carprovider is entity from external db, it has all Car attributes and more.
List<CarProvider> cars = carDao.getAllFromProvider();
for( CarProvider car: cars ){
if( persons.contains(car.getOwner().getId()){
Person p = persons.get(car.getOwner().getId());
List<Car> c = p.getCars();
for( Car p_car: c ){
if( p_car.getId() == car.getId() ) // match
p_car.setDemage(car.getDemage());
}
}
}
personDAO.saveAll(persons.values())
В основном я получаюПо данным страховой базы данных новых автомобилей, я обнаружил, есть ли владелец этого автомобиля в моей базе данных, и если да, обновите свой автомобиль.
Однако это выдает:
org.springframework.dao.InvalidDataAccessApiUsageException: объединяются несколько представлений одного и того же объекта
Как вы можете видеть, я использовал LazyLoad, поэтому я также использовал:
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
Я знаю, что этоплохая практика и проблема N + 1, однако это все же лучше, чем загружать все отношения сразу, используя EAGER, учитывая тот факт, что я выполняю эту задачу только один раз в неделю.
Я использую CrudRepository
Почему это происходит?Не встречал эту ошибку раньше и не могу найти логического обоснования.Как объединяются несколько представлений одного и того же объекта?
Это происходит только тогда, когда я использую LazyLoad.Появление этой ошибки связано с существованием сущности в моей БД.Например,
List<CarProvider> cars = carDao.getAllFromProvider();
также содержит Автомобиль, который я уже сохранил в своей БД.Таким образом, сама сущность не будет обновлять свойства, но saveAll()
будет вызываться для той же сущности, что и при ленивой загрузке.
Спасибо за помощь!