2016-03-22 15 views
3

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: enter image description here 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 (?, ?, ?, ?) 
+0

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

+0

Sorry, mein schlechtes .. Ich werde meinen Beitrag bearbeiten – MeetJoeBlack

+0

aktualisiert, pls Spaziergang durch meine Post – MeetJoeBlack

Antwort

1

Ich benutze em.persist für anhaltende Klassen. Meine Muttergesellschaft hat

@JsonProperty(TIMES) 
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) 
private Set<Times> timesList = new HashSet<Times>(); 

während das Kind

@JsonIgnore 
@ManyToOne(cascade = CascadeType.ALL) 
private Rider rider; 

Der Code hat, ist

em.persist(rider); 
for (Times t : rider.getTimes()) { 
    t.setRider(rider); 
} 

für einen neuen Fahrer, für einen vorhandenen Reiter ich die neuen Daten in das alte Objekt verschmelzen . Das Projekt ist hier: https://github.com/xtien/motogymkhana-server Der Code ist von RiderDaoImpl und Rider und Times. Dies ist, was das Projekt ist: http://www.gymcomp.com/eu

+0

Ich kann nicht Reiter zuerst, weil ich vollständige Objekt mit Kindern von Json erhalten. Also, wenn ich em.persist (Eltern) tun, hat es bereits Kinder innerhalb – MeetJoeBlack

+0

In meinem Beispiel behalte ich einen Fahrer, mit mehreren Times Objekte. Keine sind vorher vorhanden. Für einen bereits existierenden Rider führt mein Code em.merge oder so etwas nicht aus. Wenn Sie bereits ein Kind mit einem neuen Elternteil haben, sollten Sie sich Ihr Datamodell ansehen. Wenn Sie einen bereits vorhandenen Elternteil mit einem neuen Kind haben, können Sie einfach das Kind dem überlebenden Elternteil hinzufügen. – Christine

+0

Ich löste mein Problem mit em.persist() anstelle der SAVE() - Methode von spring-data-jpa. – MeetJoeBlack

Verwandte Themen