2012-05-25 17 views
6

मैंने लंबे समय तक 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 

पहले कोड ब्लॉक में मैं $ उपयोगकर्ता वस्तु दिलवाया। बदल दिया [नाम] और इसे सहेजने की कोशिश की, लेकिन असफल रहा। दूसरे ब्लॉक में (पहले से असंबंधित) मैंने फिर से $ उपयोगकर्ता ऑब्जेक्ट लाया। लेकिन ओआरएम ने पहली बार एक ही ऑब्जेक्ट को लिंक वापस कर दिया। तो इस वस्तु ने पहले से ही [नाम] संपत्ति बदल दी है। दूसरे ब्लॉक की आखिरी पंक्ति में मैं सिर्फ [अन्य] दायर सहेजना चाहता था, लेकिन दोनों [अन्य] और [नाम] अपडेट हो जाएंगे।

इस स्थिति को हल करने का सही तरीका क्या है?

उत्तर

14

यह डिज़ाइन द्वारा है।

इकाई प्रबंधक यह सुनिश्चित करता है कि आप हमेशा किसी दिए गए आईडी के लिए एक ही इकाई वापस प्राप्त करें। आखिरकार, यही पहचान है। वहाँ केवल एक ही, अद्वितीय, आईडी 1.

साथ उपयोगकर्ता हो सकता है आप डेटाबेस से एक इकाई "रीफ्रेश करें" चाहते हैं, EntityManager::refresh() आपके लिए क्या कर सकते हैं। दस्तावेज़ों से:

डेटाबेस से किसी इकाई की निरंतर स्थिति को ताज़ा करता है, जो कि अभी तक जारी नहीं किए गए स्थानीय परिवर्तनों को ओवरराइड करता है।

2

आपको आदेश निष्पादित करना होगा: $entityManager->detach($userEntity);। फ़्लश कॉल करने के बाद परिवर्तन तब डेटाबेस में दिखाई नहीं देंगे। अन्य संस्थाएं काम करेंगे।

+2

यह उत्तर एक अच्छा नहीं है: यदि 'प्रबंधित' स्थिति में कोई वस्तु (यानी 'इकाई प्रबंधक' द्वारा संभाला गया अलग-अलग वस्तु को संदर्भित करता है, तो सिद्धांत सोचता है कि अलग वस्तु एक नया है। परिणाम यह है: यदि जारी रहता है कैस्केड ऑपरेशन कॉन्फ़िगर किया गया है, एक सम्मिलित किया जाएगा। यदि कोई लगातार कैस्केड ऑपरेशन कॉन्फ़िगर नहीं किया गया है, तो एक त्रुटि "एक नई इकाई मिली ..." उठाई जाएगी। – DonCallisto