2009-06-04 3 views
10

क्योंकि प्रत्येक इकाई को स्मृति से डेटाबेस तक जारी रखने के लिए फ्लश() को कॉल करना। इसलिए यदि मैं बहुत अधिक अनावश्यक फ्लश() का उपयोग करता हूं, तो प्रदर्शन के लिए एक अच्छा विकल्प नहीं है, इसलिए इसमें अधिक समय लग सकता है। यहां एक परिदृश्य है जो मुझे नहीं पता कि फ्लश() को कब कॉल करना है?क्या इस स्थिति में फ्लश() (जेपीए इंटरफ़ेस) को कॉल करना आवश्यक है?

//Order and Item have Bidirectional Relationships 
Order ord = New ord("my first order"); 
Item item = New Item("tv",10); 

//...process item and ord object 

em.persist(ord);//em is an instance of EntityManager 
em.flush();// No.1 flush() 

item.setOrder(ord); 
em.persist(item); 

Set<Item> items= new HashSet<Item>(); 
items.add(item); 
ord.setItems(items); 

em.flush();// No.2 flush() 

मेरा प्रश्न है: नंबर 1 फ्लश के कॉलिंग या से बचने के नहीं किया जा सकता है?

चीजें मैं चिंतित है: आदेश item.setOrder (ord) करने के लिए, हम ord का एक डेटाबेस आईडी की जरूरत है। और केवल em.persist (ord) डेटाबेस आईडी उत्पन्न नहीं कर सकता है, इसलिए मुझे em.flush()item.setOrder (ord) से पहले कॉल करना होगा। तो आपकी राय क्या है?

अग्रिम धन्यवाद।

उत्तर

4

मैं पहली संरचना निर्माण करना चाहिए, और उसके बाद सब कुछ जारी रहती है।

Order ord = New ord("my first order"); 
Item item = New Item("tv",10); 

item.setOrder(ord); 

Set<Item> items= new HashSet<Item>(); 
items.add(item); 
ord.setItems(items); 

em.persist(ord); 

इस तरह, आप पूरे पेड़ को एक कॉल में जारी रखते हैं और फ्लश की आवश्यकता नहीं होती है।

अच्छी ऑब्जेक्ट डिज़ाइन में, आपको अपनी ऑब्जेक्ट्स को तार करने के लिए वर्णित डफिमो का उपयोग करना चाहिए।

+0

धन्यवाद सलंदूर! हां, मुझे लगता है कि मैं क्षणिक स्थिति में वस्तुओं का कन्स्ट्रक्शन कर सकता हूं और माता-पिता को जारी रख सकता हूं (यदि मैपिंग फ़ाइल में, बच्चों के संग्रह को कैस्केड सेट किया जाता है)। अंत में मैं फ्लश() कर सकता था। –

+0

क्या आपने कहा फ्लश() निरंतर नहीं है? –

3

मुझे लगता है कि आपको यह लेनदेन संबंधी संदर्भ में यह सब करना चाहिए और इसे आपके लिए इन मुद्दों को संभालने दें।

आप वस्तुओं में द्विदिश रिश्ते एम्बेड करने के लिए की जरूरत है:

class Parent 
{ 
    private List<Child> children; 

    public boolean addChild(Child c) 
    { 
     c.setParent(this); // this is the key piece 

     return this.children.add(c); 
    } 
} 

class Child 
{ 
    private Parent parent; 

    public void setParent(Parent p) 
    { 
     this.parent = p; 
    } 
} 
+0

धन्यवाद, आप सही हैं! और आपका एम्बेड बिडरेक्शनल रिलेशनशिप अब मेरे कोड को साफ़ कर सकता है! –

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