2015-10-23 10 views
7

私は、PostgreSQLデータベースと統合されたeBeanを使用するPlay2アプリケーションを持っています。カスケードセーブモデルは関係を保存していません

基本的に私はモデルTripRequestPassengerのリストとして持っています。ユースケースは「旅には複数の乗客がいる」というケースがあります。

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

そして、これが私の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) 

、私はTripRequestの新しいインスタンスを作成し、Passengerとセットの複数のインスタンス私はこのモデルを持っているTripRequestするため

TripRequestインスタンスの乗客リスト。 問題が発生したときに、tripRequest.save()メインインスタンス()のすべてが保存されますが、リレーションシップは保存されません(したがって、乗客のリスト)。

すべて

EDITで、私はドキュメントとサンプルを読み込みませんし、すべてが@ManyToOne注釈にCascadeType.ALLに私を指しているが、何の「運」:あなたは完全なクラスが便利だと思うなら、私は私のように知らせてください投稿することができます。私はそれらを整えたので、例を短く保つことに決めました。

+0

カスケードが '@ OneToMany'に置かれても結果は同じですか? – jsonmurphy

+0

@jsonmurphy https://gist.github.com/mribeiro/2627ecb640bf19e0adb6 –

答えて

1

私はあなたがの側にtripRequestを設定して(このクラスが実際に関係を所有しているため)、それを保存する必要があると思います。このような何か:

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

に記載されているように、NullPointerExceptionが発生します。それぞれの乗客にtripRequestインスタンスを設定しています。しかし、tripRequestを保存すると、乗客のリストは保存されません。私が見つけた回避策は、tripRequestを保存してから乗客を繰り返し処理し、それぞれを個別に保存することですが、「間違っている」と感じています。 –

+1

@MiguelRibeiro間違いは間違いです。あなたが '@ ManyToOne'の代わりに' TripRequest'の '@ OneToMany'アノテーションに'(cascade = CascadeType.ALL) 'を入れれば、二重保存なしですべて動作すると思います。これはカスケーディングの方向ですから。 – cosmolev

+2

まあ...問題が見つかりました。私は旅客にtripRequestインスタンスを設定する必要はありません。だから、第1に、カスケードは '@ OneToMany'に行く必要があります。問題は、「旅客」にIDメンバーがいないことです。 NPEがどこから来ているかを見るためにPlayのコードをデバッグする必要がありました。 –

1

あなたの@OneToMany(mappedBy = "tripRequest")...には、カスケード= CascadeType.ALL(またはCascadeType.PERSIST)を持っていません。

これは、TripRequestの保存が乗客のリストにカスケードしていないことを意味します。

関連する問題