首先-我知道,似乎同一问题被问了一百万遍。但是,这与DTO相关,与实体或丢失的级联无关。如果我自己创建一个实体并将其保存,那么一切都很好。当我创建DTO,使用ModelMapper对其进行转换然后尝试保存转换后的实体时,就会出现问题。如果您查看测试类,则第一个测试(saveCarByEntity)通过,但第二个(saveCarByDto)则产生错误。每个连接的类可以在下面看到。预先谢谢你。
实体:
@Data
@Entity
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(mappedBy = "car", cascade = CascadeType.PERSIST)
private CarDetails carDetails;
}
@Data
@Entity
public class CarDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(mappedBy = "carDetails", cascade = CascadeType.PERSIST)
private Bumper bumper;
@OneToOne
private Car car;
}
@Data
@Entity
public class Bumper {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
private CarDetails carDetails;
}
DTO-s:
@Data
public class CarDto {
private Long id;
private CarDetailsDto carDetails;
}
@Data
public class CarDetailsDto {
private Long id;
private BumperDto bumper;
private CarDto car;
}
@Data
public class BumperDto {
private Long id;
private CarDetailsDto carDetails;
}
测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
class CarTests {
@Autowired
private ModelMapper modelMapper;
@Autowired
private CarRepository carRepository;
@BeforeEach
public void setup() {
}
@Test
public void saveCarByEntity() {
Car car = new Car();
CarDetails carDetails = new CarDetails();
Bumper bumper = new Bumper();
car.setCarDetails(carDetails);
carDetails.setCar(car);
carDetails.setBumper(bumper);
bumper.setCarDetails(carDetails);
Car savedEntity = carRepository.save(car);
}
@Test
public void saveCarByDto() {
CarDto carDto = new CarDto();
CarDetailsDto carDetails = new CarDetailsDto();
BumperDto bumper = new BumperDto();
carDto.setCarDetails(carDetails);
carDetails.setCar(carDto);
carDetails.setBumper(bumper);
bumper.setCarDetails(carDetails);
Car car = modelMapper.map(carDto, Car.class);
Car savedEntity = carRepository.save(car);
}
}
产生错误:
nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.somepackage.model.Bumper.carDetails -> com.somepackage.model.CarDetails
CarRepository:
@Repository
public interface CarRepostiory extends JpaRepository<Car, Long> {
}
我不知道您的模型映射器会做什么,但是我敢打赌,如果您坚持不使用保险杠而没有保险杠的汽车详细信息,它将起作用。也许您也可以通过在Bumper中使用carDetails的CascadeType.PERSIST使其工作?