2015-10-23 13 views
7

Ich habe eine Play2-Anwendung mit eBean in PostgreSQL-Datenbank integriert.Cascade speichern Modell nicht speichern Beziehung

Grundsätzlich habe ich ein Modell TripRequest das als eine Liste von Passenger s. Der Anwendungsfall ist "Eine Reise hat mehrere Passagiere".

Für die TripRequest Ich habe dieses Modell:

@Entity 
public class TripRequest extends Model { 

    enum Status { 
     OPEN, 
     PROCESSING, 
     CLOSED, 
     CANCELLED 
    } 

    @Id 
    private UUID id; 

    @ManyToOne 
    @Column(nullable = false) 
    private User owner; 

    @OneToMany(mappedBy = "tripRequest") 
    @JoinTable(name = "trip_passengers") 
    private List<Passenger> passengers; 
    (... other fields, getters and setters ...) 

Und das ist mein Passenger Modell:

@Entity 
@Table(name = "trip_passenger") 
public class Passenger extends Model { 

    @ManyToOne(cascade = CascadeType.ALL) 
    private TripRequest tripRequest; 

    @Column(nullable = false) 
    private String name; 
    (... other fields, getters and setters) 

So schaffe ich eine neue Instanz von TripRequest, mehrere Instanzen von Passenger und festgelegt, dass Liste als die Passagiere von TripRequest Instanz. Problem ist, dass wenn ich tripRequest.save() alles in der Hauptinstanz (TripRequest) wird gespeichert wird, aber die Beziehungen sind nicht (so die Passagiere Liste).

Ich lese in der Dokumentation und Beispielen und alles zeigt mich auf die CascadeType.ALL in der @ManyToOne Anmerkung, aber kein „Glück“ auf allen

EDIT: wenn er Sie die kompletten Klassen nützlich sind, lassen Sie es mich, wie ich weiß, kann sie posten. Ich habe mich einfach dafür entschieden, das Beispiel kurz zu halten, also habe ich sie getrimmt.

+0

Ist das Ergebnis dasselbe, wenn die Kaskade stattdessen auf '@ OneToMany' gesetzt wird? – jsonmurphy

+0

@jsonmurphy Ich bekomme eine NullPointerException wie beschrieben in https://gist.github.com/mribiro/2627ecb640bf19e0adb6 –

Antwort

1

Ich denke, Sie sollten tripRequest auf Passenger Seite setzen (weil diese Klasse tatsächlich die Beziehung besitzt) und nur dann speichern Sie es. Etwas wie folgt aus:

for(Passenger p : passengers){ 
    p.tripRequest = this; 
} 
+1

Ich setze die tripRequest-Instanz auf jeden Passagier. Wenn ich jedoch den TripRequest speichere, wird die Passagierliste nicht gespeichert. Ein Workaround, den ich gefunden habe, ist, die TripRequest zu speichern und dann durch die Passagiere zu iterieren und jeden einzeln zu speichern, aber es fühlt sich "falsch" –

+1

@MiguelRibeiro Das ist definitiv falsch. Ich denke, alles funktioniert ohne Doppel-Speichern, wenn Sie '(Cascade = CascadeType.ALL)' auf die '@ OneToMany' Annotation von' TripRequest' statt auf '@ ManyToOne' von Passenger setzen. Weil das die Richtung der Kaskadierung ist. – cosmolev

+2

Nun ... das Problem gefunden. Ich muss die tripRequest-Instanz nicht einmal auf den Passagier setzen. Also muss die Kaskade zuerst an die '@ OneToMany' gehen. Das Problem ist, dass der "Passagier" kein ID-Mitglied hatte. Ich musste Play Code debuggen, um zu sehen, woher die NPE kam. –

1

Ihre @OneToMany (mappedBy = "tripRequest") ... hat keine Kaskade = CascadeType.ALL (oder CascadeType.PERSIST).

Dies bedeutet, dass die Speicherung von TripRequest nicht auf der Passagierliste angezeigt wird.

Verwandte Themen