[英]JPA Merge error : "org.hibernate.TransientPropertyValueException: object references an unsaved transient instance -"
[英]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.