保存到循环内的数据库

时间:2018-06-18 12:27:15

标签: java database spring-data

我想在我的数据库中插入一些测试数据,所以我循环保存方法。但它只节省了一次。你能解释一下原因吗?

这是我的循环控制器方法:

@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);
}

3 个答案:

答案 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();
  }