कई लोगों को एक सेव या अपडेट ऑपरेशन पर मेर्ज और पर्सिस्ट कैस्केड प्रकारों का उपयोग कैसे करें? - जेपीए, कैस्केड, कई से एक

मेरी एक इकाई में नीचे एक मानचित्रण है।जब इस इकाई को बचाने की कोशिश की जा रही है, अगर scrMSgLine id पहले से सेट है और कैस्केड प्रकार PERSIST है, तो मुझे "org.hibernate.PersistentObjectException: मिलाया गया निकाय जारी रखने के लिए पारित कर दिया गया: स्क्रैचग्लिन" अपवाद अगर मैं कैस्केड प्रकार को MERGE में बदल देता हूं तो रिकॉर्ड सफलतापूर्वक बचा लिया जाता है।

अगर scrMSgLine id शून्य है और झरना प्रकार MERGE है, तो मुझे "ऑब्जेक्ट रेफरेंस इन ए अनसेव्ड ट्रांसिएंट इंस्टेंस - फ़्लश करने से पहले ट्रांसिएंट इंस्टेंस को सेव करें" मिला।

तो मुझे किस कैस्केड प्रकार का उपयोग करना चाहिए, मैं क्या गलत कर रहा हूं?

@ManyToOne(cascade = {CascadeType.PERSIST})
@JoinColumn(name = "MSG_LINE_ID")
@Where(clause = "DELETED_AT IS NULL")
public ScrMsgLine getScrMsgLine() {
return scrMsgLine;
}

उत्तर:

जवाब के लिए 0 № 1

यह लेन-देन की समस्या थीकैस्केड प्रकार के बजाय। मैं scrMsgLine ऑब्जेक्ट को सहेजने के बाद एक नया tnx बना रहा था। जब मैं इसे नए tnx को पास करता हूं तो यह अलग हो रहा था। एक काम के रूप में मैं इसे नए tnx की भीख में db से पढ़ता हूं। और मैंने कैस्केड प्रकार को PERSIST में बदल दिया। मुझे यकीन नहीं है कि यह सही समाधान है, लेकिन अभी के लिए यह मेरे लिए काम करता है ...


जवाब के लिए 0 № 2

अपवादों से बचने के लिए; अपनी वस्तुओं को बचाने के बजाय मर्ज विधि का उपयोग करें और ScrMsgLine पर CascadeType.ALL का उपयोग करें।

जब तक आपके रिश्ते तय होते हैंCascadeType.ALL, आप हमेशा अपने em.persist (परीक्षा) को बदल सकते हैं; to em.merge (exam) ;; यह नई वस्तु को बनाए रखने का ख्याल रखेगा, और यह ScrMsgLine में मर्ज कॉल को भी रोक देगा।

तथा यह क्यू एंड ए अधिक सहायक हो सकता है।

मुझे उम्मीद है यह मदद करेगा।


संबंधित सवाल
सबसे लोकप्रिय