Java 使用容器实体使用Post方法将值传递给实体列表时出错
我想使用RouteDto和TrainDto将列车实体列表传递给route实体。但列车数据未在数据库中持久化。我还希望自动生成ID。我在控制器类中使用post方法,并使用RouteService从存储库调用save方法 RouteDto.javaJava 使用容器实体使用Post方法将值传递给实体列表时出错,java,spring-boot,persistence,Java,Spring Boot,Persistence,我想使用RouteDto和TrainDto将列车实体列表传递给route实体。但列车数据未在数据库中持久化。我还希望自动生成ID。我在控制器类中使用post方法,并使用RouteService从存储库调用save方法 RouteDto.java public class RouteDto { @GeneratedValue @Min(value = 100) @Max(value = 999) int id; @N
public class RouteDto {
@GeneratedValue
@Min(value = 100)
@Max(value = 999)
int id;
@NotEmpty(message="Source cannot be null")
@Pattern(regexp="^[A-Za-z]+$")
String source;
@NotEmpty(message="Destination cannot be null")
@Pattern(regexp="^[A-Za-z]+$")
String destination;
@OneToMany
// @NotEmpty(message="Train List cannot be null")
private List<TrainDto> trainList;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getDestination() {
return destination;
}
public void setDestination(String destination) {
this.destination = destination;
}
public List<TrainDto> getTrainList() {
return trainList;
}
public void setTrainList(List<TrainDto> trainList) {
this.trainList = trainList;
}
public RouteEntity createEntity() {
RouteEntity routeEntity=new RouteEntity();
routeEntity.setId(this.getId());
routeEntity.setSource(this.getSource());
routeEntity.setDestination(this.getDestination());
List<TrainEntity> trainEntityList=new ArrayList<TrainEntity>();
List<TrainDto> trainDtoList=this .getTrainList();
if(trainDtoList!=null) {
for(TrainDto train:trainDtoList) {
trainEntityList.add(train.createEntity());
}
}
routeEntity.setTrainList(trainEntityList);
return routeEntity;
}
}
RouteService.java
@Service
public class RouteService {
@Autowired
RouteRepository routeRepository;
public int createRoute(RouteDto route) {
RouteEntity routeEntity=route.createEntity();
routeRepository.save(routeEntity);
return routeEntity.getId();
}
}
RouteControl.java
@RestController
public class RouteController {
@Autowired
RouteService routeService;
@PostMapping("/routes")
public ResponseEntity<Integer> createRoute(@Validated @RequestBody RouteDto routeDto){
int routeId=routeService.createRoute(routeDto);
return new ResponseEntity<>(routeId, HttpStatus.OK);
}
}
RouteEntity.java
@Entity
@Table(name="route")
public class RouteEntity {
@Id
int id;
String source;
String destination;
@OneToMany
private List<TrainEntity> trainList;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getDestination() {
return destination;
}
public void setDestination(String destination) {
this.destination = destination;
}
public List<TrainEntity> getTrainList() {
return trainList;
}
public void setTrainList(List<TrainEntity> trainList) {
this.trainList = trainList;
}
}
@Entity
@Table(name="train")
public class TrainEntity {
@Id
@GeneratedValue
int id;
String trainName;
String arrivalTime;
String departureTime;
Double fare;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTrainName() {
return trainName;
}
public void setTrainName(String trainName) {
this.trainName = trainName;
}
public String getArrivalTime() {
return arrivalTime;
}
public void setArrivalTime(String arrivalTime) {
this.arrivalTime = arrivalTime;
}
public String getDepartureTime() {
return departureTime;
}
public void setDepartureTime(String departureTime) {
this.departureTime = departureTime;
}
public Double getFare() {
return fare;
}
public void setFare(Double fare) {
this.fare = fare;
}
}
The train list is coming empty.
在
RouteEntity
表中,在id上添加@GeneratedValue以生成id
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int id;
并添加CascadeType.ALL
,使列车列表保持不变
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private List<TrainEntity> trainList;
@OneToMany(cascade=CascadeType.ALL,orphan=true)
私人名单列车名单;
添加实体类请立即检查。如何创建数据库?对于单向关系,需要一个额外的映射表或使用联接列。表route_train_列表自动创建,列route_id和train_id分别得到此错误{“timestamp”:“2020-06-09T20:48:51.998+00:00”,“status”:500,“error”:“Internal Server error”,“trace”:“org.springframework.dao.DataIntegrityViolationException:无法执行语句;SQL[n/a];约束[PRIMARY];嵌套异常为org.hibernate.exception.ConstraintViolationException:无法执行语句\r\n\t清除旧数据并重试。可能主键已存在,并且在编译时不在JSONG中发送id。我认为hibernate正在尝试创建名为train_list的列。嵌套异常为org.hibernate.MappingException:Could未确定列:[org.hibernate.mapping.Column(train_List)]的表:route中的java.util.List的类型@SamratDas无法复制,您应该检查更多细节,这是不同的问题,父子同步问题,当您使用双向关系而不是单向关系时发生的。不用担心。如您所愿。我的目的是提供您尝试过的单向解决方案
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private List<TrainEntity> trainList;