簡體   English   中英

保存從 DTO 轉換的實體時,hibernate 拋出 TransientPropertyValueException: object 引用未保存的瞬態實例”

[英]When saving entity converted from a DTO, hibernate throws TransientPropertyValueException: object references an unsaved transient instance"

首先——我知道,同一個問題似乎已經被問了一百萬次了。 但是,這與 DTO 相關,而不是實體或缺少的級聯。 如果我自己創建一個實體並保存它,一切都很好。 當我創建 DTO,使用 ModelMapper 對其進行轉換,然后嘗試保存轉換后的實體時,就會出現問題。 如果您查看測試 class,第一個測試(saveCarByEntity)通過但第二個(saveCarByDto)產生錯誤。 每個連接的 class 可以在下面看到。 先感謝您。

實體

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

測試 class:

@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

汽車倉庫:

@Repository
public interface CarRepostiory extends JpaRepository<Car, Long> {
}

我不知道你的 model 映射器是做什么的,但我敢打賭,如果你在沒有保險杠和保險杠的情況下保留汽車細節,它會起作用。 也許您也可以通過在 Bumper for carDetails 中使用 CascadeType.PERSIST 來使其工作?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM