मैंने लंबे समय तक SQL-query-based डेटाबेस पहुंच स्तर का उपयोग किया। लेकिन अब मैंने ओआरएम सिद्धांत 2 का उपयोग करने का फैसला किया है। इस समय मेरे पास इकाइयों वर्कफ़्लो की एक वैचारिक गलतफहमी है।मैं सिद्धांत 2 में किसी इकाई में गैर-फ्लश किए गए परिवर्तनों को कैसे हटा सकता हूं?
सर्वश्रेष्ठ उदाहरण द्वारा वर्णित:
try {
$user = $entityManager->find('User', 1);
$user->setName('New name');
$entityManager->flush();
}
catch (...)
{
// !we are here: changes failed and $user-row in DB was not updated
}
// ...
$user = $entityManager->find('User', 1);
$user->setOther('Other');
$entityManager->flush(); // <- in this request both [other] and [name] fields will be updated to DB, but only [other] update expected
पहले कोड ब्लॉक में मैं $ उपयोगकर्ता वस्तु दिलवाया। बदल दिया [नाम] और इसे सहेजने की कोशिश की, लेकिन असफल रहा। दूसरे ब्लॉक में (पहले से असंबंधित) मैंने फिर से $ उपयोगकर्ता ऑब्जेक्ट लाया। लेकिन ओआरएम ने पहली बार एक ही ऑब्जेक्ट को लिंक वापस कर दिया। तो इस वस्तु ने पहले से ही [नाम] संपत्ति बदल दी है। दूसरे ब्लॉक की आखिरी पंक्ति में मैं सिर्फ [अन्य] दायर सहेजना चाहता था, लेकिन दोनों [अन्य] और [नाम] अपडेट हो जाएंगे।
इस स्थिति को हल करने का सही तरीका क्या है?
यह उत्तर एक अच्छा नहीं है: यदि 'प्रबंधित' स्थिति में कोई वस्तु (यानी 'इकाई प्रबंधक' द्वारा संभाला गया अलग-अलग वस्तु को संदर्भित करता है, तो सिद्धांत सोचता है कि अलग वस्तु एक नया है। परिणाम यह है: यदि जारी रहता है कैस्केड ऑपरेशन कॉन्फ़िगर किया गया है, एक सम्मिलित किया जाएगा। यदि कोई लगातार कैस्केड ऑपरेशन कॉन्फ़िगर नहीं किया गया है, तो एक त्रुटि "एक नई इकाई मिली ..." उठाई जाएगी। – DonCallisto