2012-11-18 20 views
13

प्रश्न डॉक्टरेट के बारे में है लेकिन मुझे लगता है कि इसे कई ओआरएम तक बढ़ाया जा सकता है।ओआरएम में इकाइयों को अलग करने और विलय करने की आवश्यकता क्यों है?

अलग करें:

एक इकाई एक EntityManager से अलग है और इस तरह नहीं रह गया है उस पर EntityManager#detach($entity) विधि लागू करके या द्वारा इसे करने के लिए अलग आपरेशन व्यापक में कामयाब रहे। पृथक इकाई में किए गए परिवर्तन, यदि कोई है (इकाई को हटाने सहित) इकाई को अलग करने के बाद डेटाबेस में सिंक्रनाइज़ नहीं किया जाएगा।

सम्मिलित करें:

विलय संस्थाओं एक EntityManager इतना है कि वे फिर से कामयाब हो जाते हैं के संदर्भ में की (आम तौर पर अलग) संस्थाओं विलय को दर्शाता है। किसी इकाई की स्थिति को EntityManager में मर्ज करने के लिए EntityManager#merge($entity) विधि का उपयोग करें। उत्तीर्ण इकाई की स्थिति इस इकाई की एक प्रबंधित प्रति में विलय हो जाएगी और यह प्रतिलिपि बाद में लौटा दी जाएगी।

मैं समझता हूं (लगभग) यह कैसे काम करता है, लेकिन सवाल यह है: क्यों किसी को एंटीटीज को अलग करने/विलय करने की आवश्यकता होगी? क्या आप मुझे एक उदाहरण/परिदृश्य दे सकते हैं जब इन दोनों परिचालनों का उपयोग/आवश्यकता हो सकती है?

उत्तर

14

मुझे किसी इकाई को कब हटाना चाहिए?
एक ईएम (EntityManager) से एक इकाई Detaching व्यापक रूप से प्रयोग किया जाता है जब आप एक से अधिक ईएम से निपटने और संगामिति संघर्ष से बचने के उदाहरण के लिए:

$user= $em->find('models\User', 1); 
$user->setName('Foo'); 

// You can not remove this user, 
// because it still attached to the first Entity Manager 
$em2->remove($user); 
$em2->flush(); 

आप नहीं $user वस्तु के नियंत्रण $em2 से ले जा सकते हैं, क्योंकि इसका सत्र $em से संबंधित है जो प्रारंभ में डेटाबेस से $user लोड करता है। उन्हें ऊपर की समस्या का समाधान कैसे करें? आप वस्तु अलग करने की जरूरत है:

$user= $em->find('models\User', 1); 
$user->setName('Foo'); 

$em2->detach($user); 
$em2->remove($user); 
$em2->flush(); 

जब मैं विलय उपयोग किसे करना चाहिए समारोह?

$user= $em->find('models\User', 1); 
$user->setName('Foo'); 

$em->merge($user); 
$em->flush(); 

ईएम एक बनाम स्मृति में $ उपयोगकर्ता डेटाबेस में $ उपयोगकर्ता के बीच तुलना कर देगा:
मूल रूप से जब आप एक इकाई को अपडेट करना चाहते हैं। एक बार जब ईएम बदलते फ़ील्ड को पहचान लेता है, तो यह केवल उन्हें अपडेट करता है और पुराने लोगों को रखता है।

flush विधि से चलाता है एक प्रतिबद्ध और उपयोगकर्ता नाम डेटाबेस

+0

मैं सभी के साथ सहमत है फ्लश के बारे में क्या कहा जाता है इसके अलावा कहा। फ्लश विधि डेटाबेस के साथ इकाइयों को सिंक्रनाइज़ करता है लेकिन लेनदेन सीमाओं के अंदर। यह एक ही लेनदेन के भीतर एक प्रश्न का आह्वान करने पर खेलने के लिए आता है। इस प्रकार आप गारंटी देते हैं कि क्वेरी की प्रसंस्करण इस लेनदेन के अपडेट को ध्यान में रखती है। – Sam

+0

आप सही हैं @ सैम, मैं फ्लश विधि के साथ गलत था। – manix

+1

यह एक अच्छा स्पष्टीकरण (+1) है, लेकिन किसी को पहले स्थान पर एक से अधिक इकाई प्रबंधक का उपयोग क्यों करना चाहिए? यह नहीं मिल सकता है, क्षमा करें, हमेशा एक इकाई प्रबंधक के साथ सिद्धांत का उपयोग करें ... – gremo

1

आप जब संगामिति के मुद्दों से निपटने के एक इकाई को अलग करने की आवश्यकता होगी में अद्यतन करेगा।

मान लीजिए कि आप एक एसिंक्रोनस एपीआई का उपयोग कर रहे हैं जो आपके प्रोजेक्ट में कॉलबैक करता है। जब आप कॉलबैक निर्देश के साथ एपीआई कॉल जारी करते हैं, तो भी आप कॉलबैक से प्रभावित इकाई का प्रबंधन कर सकते हैं, और इसलिए कॉलबैक द्वारा किए गए परिवर्तनों को ओवरराइट कर सकते हैं।

-1

जब आप अपने डेटाबेस में गहन डेटा रखते हैं तो आप इकाई को भी अलग कर सकते हैं, लेकिन आपके कोड में आप उपयोगकर्ता खाते के आधार पर इस संस्था को संशोधित करते हैं।

उदाहरण के लिए ब्राउज़र गेम जिसमें कुछ पात्र हैं और कुछ हमले लड़ने के लिए हैं। AttackOne "UserFoo" (90 LVL) द्वारा इस्तेमाल किया बेहतर बोनस द्वारा संशोधित किया जाएगा की तुलना में "UserBarr" (LVL 20) द्वारा प्रयोग किया जाता है, लेकिन हमारे डेटाबेस AttackOne में हर समय एक ही हमले