我想在我的数据库中插入一些测试数据,所以我循环保存方法。但它只节省了一次。你能解释一下原因吗?
这是我的循环控制器方法:
@PostMapping("")
public Long save(@RequestBody Car car) {
for (int i = 0; i < 100; i++) {
System.out.println("??");
carService.save(car);
}
Car savedCar = carService.save(car);
return savedCar.getId();
}
carService:
@Override
public Car save(Car car) {
return carRepository.save(car);
}
carRepository:
public interface CarRepository extends CrudRepository<Car, Long> {
List<Car> findAll();
Car getCarById(Long id);
}
答案 0 :(得分:4)
它保存了一次,因为您保存了相同Car
个对象的100倍。未检测到任何更改,也无需刷新对象的持久状态。
在第一次保存操作之前,car
实例只是一个值对象,在某种意义上,它还没有持久状态。这意味着id
没有关联value object
。第一次保存完成后,car
现在有一个与之关联的标识符。在每次连续保存时,此id
用于标识对象,因为未进行任何更改,因此无需在数据库中执行任何更改。
答案 1 :(得分:1)
因为Spring data -jpa的save方法是为两者保存和更新。保存数据后,通过创建新行将其保存在db中,但第二次再次保存相同的数据。 Spring-data-jpa查找相同的数据,因此它只更新同一行而不创建新行
答案 2 :(得分:0)
使用Hibernate
在数据库中保存时,会自动传递引用对象,id会在对象中设置,因此当您再次保存时,它只会编辑对象。
如果您愿意,请将ID更改为0
。
@PostMapping("")
public Long save(@RequestBody Car car) {
for (int i = 0; i < 100; i++) {
System.out.println("??");
car.setId(0);
carService.save(car);
}
Car savedCar = carService.save(car);
return savedCar.getId();
}