我尝试使用一对多关系持久化父实体:
@Entity
public class TrainEx {
private Set<TrainCompositionEx> trainCompositionsByTrainId;
@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY, mappedBy = "trainByTrainId")
public Set<TrainCompositionEx> getTrainCompositionsByTrainId() {
return trainCompositionsByTrainId;
}
public void setTrainCompositionsByTrainId(Set<TrainCompositionEx> trainCompositionsByTrainId) {
this.trainCompositionsByTrainId = trainCompositionsByTrainId;
}
...
}
以及子实体:
@Entity
public class TrainCompositionEx{
@Id
@ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
@JoinColumn(name = "trainId", referencedColumnName = "trainId", nullable = false, insertable = true, updatable = true)
private TrainEx trainByTrainId;
....
}
所以我通过json POST端点收到了我的TrainEx培训材料:
@RequestMapping(method= RequestMethod.POST, consumes = "application/json", produces = "application/json")
public @ResponseBody
ResponseEntity<Void> addTrain(@RequestBody TrainEx trainEx) throws Exception {
trainService.add(trainEx);
return new ResponseEntity<Void>(HttpStatus.CREATED);
}
JSON:
{
"trainId" : 5,
"status" : 1,
"maxWeight" : 200,
"maxLength" : 35,
"speed" : 60,
"totalWeight" : 100,
"totalLength" : 20,
"trainCompositionsByTrainId": [{
"wagonByWagonId": {"wagonId" : 2}
}]
}
我将其保存后:
...
@Transactional
public TrainEx add(TrainEx trainEx) {
for(TrainCompositionEx trainCompositionEx : trainEx.getTrainCompositionsByTrainId()){
trainCompositionEx.setTrainByTrainId(trainEx);
trainCompositionEx.setWagonByWagonId(
em.getReference(WagonEx.class, trainCompositionEx.getWagonByWagonId().getWagonId()));
}
return trainExRepository.save(trainEx);
}
...
但我收到了SQL错误:"null value in column "trainid" violates not-null constraint",但是你可以看到我已经将实体trainEx设置为TrainCompositionEx,而且我在调试模式下停止并检查过trainId存在:
![enter image description here](https://istack.dev59.com/e7aIr.webp)
更新1: 我研究了日志,认为问题在于子实体在父实体之前持久化,因为我插入train_composition表,而不是train表,请参考:
Hibernate: insert into tms.public.train_composition (version, transportOrderId, wagonId, trainId) values (?, ?, ?, ?)