2010-08-30 18 views
6

नीचे एक नई वस्तु जोड़ना धीमा कर देता है मैं जे 2 एस प्रोजेक्ट में पोस्टग्रे एसक्यूएल डेटाबेस के साथ जेपीए + हाइबरनेट का उपयोग कर रहा हूं।
मेरे पास 2 इकाइयां और बी है। में बी पर @OneToMany रिश्ते है।
मेरे डोमेन मॉडल में लाखों बी के संदर्भ में हो सकता है। जब मैं संग्रह में एक नई वस्तु जोड़ता हूं तो इसे पूरा करने में कुछ मिनट लगते हैं।जेपीए + हाइबरनेट (जे 2 एसई) @OneToMany - लाखों रिकॉर्ड्स

@OneToMany(cascade=CascadeType.PERSIST) 
Collection<B> foo = new ArrayList<B>(); // might contain millions of records 
//... 
// this takes a lot of time 
foo.add(new B()); 

मुझे लगता है कि जेपीए नई वस्तु को सम्मिलित करने से पहले पूरे संग्रह को प्राप्त करता है। क्या रिश्ते को कॉन्फ़िगर करने की कोई संभावना है ताकि संग्रह में कोई नई वस्तु जोड़कर कोई fetch ऑपरेशन नहीं किया जा सके?

उत्तर

3

@OneToany संबंध जेपीए का उपयोग करते समय आलसी लोड होते हैं। इसका मतलब है कि किसी भी कॉल को फू के परिणामस्वरूप जेपीए डेटाबेस में संदर्भित सभी प्रविष्टियों को लोड कर देगा।

एकमात्र तरीका जिसे मैं इससे बचने के लिए जानता हूं वह है कि आप अपने रिश्ते को उलट दें, और बी पर एक @ManyToOne रिश्ते को परिभाषित करें (ए को इंगित करें)। इस प्रकार, आपके पास एक संग्रह नहीं है जिसे आपके डेटाबेस में एक नई वस्तु डालने के लिए लोड करने की आवश्यकता है।

public class B { 

    @ManyToOne 
    private A a; 

    public void foo() { 
     A a = new A(); 
     B b = new B(); 
     b.setA(a); // Instead of a.getFoo().add(b); 
     // Persist b in database... 
    } 

} 
1

उपयोग संपत्ति का उपयोग करने के बजाय

@OneToMany(cascade=CascadeType.PERSIST) 
public Collection<B> getFoo() { 
    return foo; 
} 

जेपीए कार्यान्वयन प्रॉक्सी का उपयोग करता है:

यहाँ एक कोड नमूना है। लेकिन यह संपत्ति एक्सेस रणनीति का उपयोग करते समय बस काम करता है

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