2015-10-23 6 views
7

Ho un'applicazione Play2 che utilizza eBean integrato con il database PostgreSQL.Modello di salvataggio in cascata che non salva la relazione

Fondamentalmente ho un modello TripRequest che come un elenco di Passenger s. Il caso d'uso è "Un viaggio ha diversi passeggeri".

Per la TripRequest ho questo modello:

@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 ...) 

e questo è il mio modello Passenger:

@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) 

Così, ho creare una nuova istanza di TripRequest, diversi casi di Passenger e set che elencare come i passeggeri dell'istanza TripRequest. Il problema è che quando eseguo il comando tripRequest.save(), tutto nell'istanza principale (TripRequest) viene salvato ma le relazioni non lo sono (quindi l'elenco dei passeggeri).

ho letto nella documentazione e gli esempi e tutto quello che mi sta indicando al CascadeType.ALL nel @ManyToOne di annotazione, ma non "fortuna" a tutti

EDIT: se si pensa le classi completi sono utili per favore fatemelo sapere come io può pubblicarli. Ho deciso di mantenere l'esempio breve, così li ho tagliati.

+0

Il risultato è lo stesso se la cascata viene posizionata su '@ OneToMany'? – jsonmurphy

+0

@jsonmurphy Ricevo una NullPointerException come descritto in https://gist.github.com/mribeiro/2627ecb640bf19e0adb6 –

risposta

1

Penso che dovresti impostare tripRequest sul lato Passenger (perché questa classe possiede effettivamente la relazione) e solo dopo salvarla. Qualcosa di simile a questo:

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

Sto impostando l'istanza tripRequest su ciascun passeggero. Tuttavia, quando salgo il viaggio, richiedi l'elenco dei passeggeri non salvato. Una soluzione che ho trovato è di salvare il tripRequest e poi iterare attraverso i passeggeri e salvarli individualmente, ma sembra "sbagliato" –

+1

@MiguelRibeiro Questo è decisamente sbagliato. Penso che tutto funzionerà senza doppio salvataggio se si mette '(cascade = CascadeType.ALL)' all'annotazione '@ OneToMany' di' TripRequest' invece di '@ ManyToOne' di Passenger. Perché questa è la direzione della cascata. – cosmolev

+2

Bene ... ha trovato il problema. Non ho nemmeno bisogno di impostare l'istanza tripRequest sul Passenger. Quindi, in primo luogo, la cascata deve andare a '@ OneToMany'. Il problema è che il 'Passeggero' non ha un membro ID. Ho dovuto eseguire il debug del codice di Play per vedere da dove arrivava l'NPE. –

1

tuo @OneToMany (mappedBy = "tripRequest") ... non ha cascade = CascadeType.ALL (o CascadeType.PERSIST).

Ciò significa che il salvataggio su TripRequest non è a cascata nell'elenco dei passeggeri.

Problemi correlati