Ich versuche Muttergesellschaft mit einem zu vielen Beziehung zu beharren:SPRING DATA JPA speichern @OneToMany Beziehung
@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;
}
...
}
und Kind Einheit:
@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;
....
}
So erhalte ich meine TRAINEX TRAINEX von json POST Endpunkt :
@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}
}]
}
nachdem ich speichern Sie es wie folgt aus:
...
@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);
}
...
Aber ich erhielt SQL ERROR: Nullwert in der Spalte "trainid" verletzt nicht-NULL-Constraint, aber wie Sie sehen, ich gefassten TRAINEX Einheit TrainCompositionEx, und ich habe im Debug-Modus angehalten und trainId existiert dort: also was soll ich tun?
UPDATE1: suchte ich Protokolle und denke, dass Problem, dass beharren Childs vor Mutterunternehmen, weil ich in train_composition Tabelle einfügen, aber nicht in Zug Tabelle sehen:
Hibernate: insert into tms.public.train_composition (version, transportOrderId, wagonId, trainId) values (?, ?, ?, ?)
Sie verwenden trainCompositionEx.setTrainByTrainId (trainEx); und Speichern von TrainEx, aber Erstellen und Verwenden von TrainEx1 überall sonst. Dieser Code macht keinen Sinn, denn was ist der neue TrainEx1 für und was macht trainCompositionEx.setTrainByTrainId (trainEx)? Sollte die TrainCompositionEx nicht zur trainEx-Liste trainCompositionsByTrainId hinzugefügt werden, anstatt eine neue trainEx1- und new trainCompositionExes-Liste zu erstellen? – Chris
Sorry, mein schlechtes .. Ich werde meinen Beitrag bearbeiten – MeetJoeBlack
aktualisiert, pls Spaziergang durch meine Post – MeetJoeBlack