2015-10-23 12 views
7

मेरे पास PostgreSQL डेटाबेस के साथ एकीकृत eBean का उपयोग कर Play2 एप्लिकेशन है।कैस्केड मॉडल को बचाने के लिए मॉडल को बचाने के लिए

असल में मेरे पास TripRequest एक मॉडल है जो एस की सूची के रूप में है। उपयोग का मामला "एक यात्रा में कई यात्रियों हैं"।

TripRequest के लिए मैं इस मॉडल है:

@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.save() मुख्य उदाहरण (TripRequest) में सबकुछ बचाता हूं लेकिन संबंध नहीं हैं (इसलिए यात्रियों की सूची)।

मैं प्रलेखन और उदाहरण में पढ़ सकते हैं और सब कुछ @ManyToOne एनोटेशन लेकिन सभी

संपादित में कोई "लक" में CascadeType.ALL करने के लिए मुझे इशारा कर रही है: अगर आपको लगता है पूरा कक्षाएं उपयोगी होते हैं मुझे मैं के रूप में हमें बताएं उन्हें पोस्ट कर सकते हैं। बस उदाहरण को छोटा रखने का फैसला किया ताकि मैंने उन्हें छीन लिया।

+0

क्या परिणाम वही है यदि कैस्केड को '@ OneToMany'' पर रखा गया है? – jsonmurphy

+0

@jsonmurphy मुझे https://gist.github.com/mribeiro/2627ecb640bf19e0adb6 –

उत्तर

1

मुझे लगता है कि आपको Passenger पक्ष पर सेट करना चाहिए (क्योंकि इस वर्ग का वास्तव में रिश्ते का मालिक है) और केवल तब इसे सहेज लें। कुछ इस तरह:

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

में वर्णित एक NullPointerException मिलता है, मैं प्रत्येक यात्री पर tripRequest उदाहरण सेट कर रहा हूं। हालांकि, जब मैं यात्रा को बचाता हूं तो यात्रियों की सूची सहेजी नहीं जाती है। मुझे पता चला कि एक कामकाज यात्रा को बचाने के लिए है और फिर यात्रियों के माध्यम से पुन: प्रयास करें और प्रत्येक को अलग से बचाएं, लेकिन यह "गलत" –

+1

@MiguelRibeiro लगता है कि यह निश्चित रूप से गलत है। मुझे लगता है कि अगर आप '(कैस्केड = कैस्केड टाइप.एएल) 'को' ट्रिपरवेस्ट 'के' @ वनटोन' के बजाय यात्री के '@TTMON'' पर डालते हैं तो सबकुछ दोबारा बचाए बिना काम करेगा। क्योंकि यह कैस्केडिंग की दिशा है। – cosmolev

+2

अच्छा ... समस्या मिली। मुझे पैसेंजर को ट्रिप रिवेस्ट इंस्टेंस सेट करने की भी आवश्यकता नहीं है। तो, सबसे पहले, कैस्केड को '@ OneToMany'' पर जाना होगा। समस्या यह है कि 'यात्री' के पास आईडी सदस्य नहीं था। एनपीई कहां से आ रहा था, यह देखने के लिए मुझे प्ले के कोड को डीबग करना पड़ा। –

1

आपका @OneToMany (mappedBy = "tripRequest") ... कोई झरना = CascadeType.ALL (या CascadeType.PERSIST) है।

इसका मतलब है कि TripRequest पर बचत यात्रियों की सूची पर कैस्केडिंग नहीं कर रही है।

संबंधित मुद्दे