【发布时间】:2020-04-19 08:38:18
【问题描述】:
首先 - 我知道,同一个问题似乎已被问过一百万次。但是,这与 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
汽车存储库:
@Repository
public interface CarRepostiory extends JpaRepository<Car, Long> {
}
【问题讨论】:
-
能否提供
ModelMapper和CarRepository课程的代码? -
也可以尝试使用
cascade = CascadeType.ALL而不是PERSIST,然后告诉我进展如何 -
我已经尝试过使用 CascadeType.ALL 而不是 PERSIST 但没有效果。至于 ModelMapper,我不使用自定义类。我只是用了包外的modelmapper.org/user-manual上面添加了CarRepostiory类
-
将
@JoinColumn(name = "car_id")和@JoinColumn(name = "carDetails_id")分别添加到CarDetails#car和Bumper#carDetails -
我认为你的 modelMapper 打破了父子关系,好像 Bumper 没有引用它的父“carDetails”。从错误“瞬态实例”是 Bumper 的父级,而 orm 尝试保存子级时,它看到未保存的父级(carDetails)
标签: java hibernate jpa dto modelmapper