当保存实体从DTO转换时,休眠会抛出TransientPropertyValueException:对象引用了一个未保存的瞬态实例“

问题描述 投票:0回答:1

首先-我知道,似乎同一问题被问了一百万遍。但是,这与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> {
}
java hibernate jpa dto modelmapper
1个回答
0
投票

我不知道您的模型映射器会做什么,但是我敢打赌,如果您坚持不使用保险杠而没有保险杠的汽车详细信息,它将起作用。也许您也可以通过在Bumper中使用carDetails的CascadeType.PERSIST使其工作?

© www.soinside.com 2019 - 2024. All rights reserved.