2011-12-07 16 views
6

मैंने वास्तव में एक कष्टप्रद स्थिति पर ठोकर खाई है: मैं अपने ऐप के बैकएंड के रूप में हाइबरनेट & वसंत का उपयोग कर रहा हूं और ऐसा लगता है कि कुछ मामलों में, जो संस्थाएं किसी विशेष संबंध में हैं इकाई को डीबी से सामान्य इकाई वस्तुओं के रूप में नहीं लाया जाता है, लेकिन जावासिस्ट प्रकार के रूप में। उदाहरण के लिए:वास्तविक हाइबरनेट इकाई प्रकारों के बजाय जावासिस्ट प्रकार प्राप्त करना

मैं निम्नलिखित रिश्तों के साथ अभियान इकाई है:

@Entity 
@Table(name = "campaign") 
public class Campaign implements Serializable { 
    [..] 
    @ManyToMany(fetch = FetchType.LAZY) 
    @JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = { 
     "campaign_id", "dealer_id" }), name = "campaign_has_dealer", joinColumns = { @JoinColumn(name = "campaign_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "dealer_id", nullable = false) }) 
    private List<Dealer> dealers = new ArrayList<Dealer>(); 

@ManyToMany 
// (fetch = FetchType.LAZY) 
@JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = { 
     "campaign_id", "sales_area_id" }), name = "campaign_has_sales_area", joinColumns = { @JoinColumn(name = "campaign_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "sales_area_id", nullable = false) }) 
private List<SalesArea> salesAreas = new ArrayList<SalesArea>(); 
} 

इस अभियान से जुड़े salesAreas पुन: प्राप्त करने पर, मैंने, _ $$ _ javassist_56 SalesArea की एक सूची प्राप्त है, जबकि डीलरों के लिए, मैं सामान्य मिल हाइबरनेट इकाइयों। चूंकि ग्राहक भाग जीडब्ल्यूटी पर आधारित है, इसलिए हम सामान पुनर्प्राप्त करने के लिए RequestFactory का उपयोग करते हैं। मैंने शुरू में सोचा था कि यह प्रॉक्सी, लोकेटर और इतने पर एक समस्या थी, लेकिन मैंने सेवा में ब्रेकपॉइंट सेट किया है जहां इन्हें पुनर्प्राप्त किया गया है और वे उन्हें चुनने के बाद सीधे जावासिस्ट ऑब्जेक्ट्स हैं। ऐसा लगता है कि FetchType.LAZY एनोटेशन (हालांकि निश्चित रूप से एक वांछनीय समाधान नहीं) को भी हटा रहा है, वही बात होती है। यह अन्य प्रकार के रिश्तों के साथ भी हुआ, न केवल @ManyToMany।

हम एनडब्ल्यूशन के लिए जीडब्ल्यूटी 2.3, स्प्रिंग 3, हाइबरनेट 3.6.3 और जेपीए 2.0 का उपयोग कर रहे हैं।

किसी भी सुझाव की सराहना की जाएगी।

अग्रिम

+2

FetchType.LAZY जेपीए डिफ़ॉल्ट है। इसे हटाने से कुछ भी नहीं होता है, जब तक कि आप इसके बजाय FetchType.EAGER निर्दिष्ट नहीं करते। – viktor

उत्तर

4

जहां तक ​​मेरा बड़ी समस्या यह है कि आप मना रहे हैं देख सकते हैं धन्यवाद इतना आपके सहयोग के प्रकार को नहीं लाया जा रहा है, लेकिन उसे प्रॉक्सी प्रकार RequestFactory के साथ अच्छी तरह से काम नहीं करते बल्कि कि।

हां, इसे fetch रणनीति को बदलकर हल किया जा सकता है लेकिन यह अजीब परिस्थितियों को तोड़ने वाले कमज़ोर कामकाज की तरह लगता है।

मुझे याद नहीं है कि इसे कैसे हल किया जाए, लेकिन मैंने किया, और जहां तक ​​मुझे याद है कि ServiceLayerDecorator क्लास में एक एक्सटेंशन बिंदु था। असल में वहां आप जांचते हैं कि आप जिस ऑब्जेक्ट को लौट रहे हैं वह एक हाइबरनेट प्रॉक्सी है (हाइबरनेट और हाइबरनेट प्रॉक्सी क्लास की जांच करें) और उसके बाद सर्विसलेयर डिकोरेटर में गैर-प्रॉक्सी प्रकार वापस करें। (http://code.google.com/p/google-web-toolkit/issues/detail?id=6767)

आपकी fetch रणनीति के लिए, मैं बड़े पैमाने पर @ बैचसाइज (एन) की सिफारिश करता हूं जहां एन बड़ा है (शायद 1000), लेकिन यह एक स्वतंत्र विषय है।

शुभकामनाएं!

+1

बहुत बहुत धन्यवाद, समाधान कस्टम सर्विसलेयर डिकोरेटर को कार्यान्वित करना था और GetProperty विधि को ओवरराइड करना था, जैसा कि किसी ने आपके द्वारा भेजे गए लिंक में कहा था। यह अब काम करता है ! :) – AndaP

0

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

व्यक्तिगत तौर पर मैं कभी नहीं (यमक क्षमा) बने समाधान के साथ में भावना देखना है कि इतने सारे समस्याओं के कारण और उस अजीब, unintuitive समाधान, लेकिन अभी भी लोगों की आवश्यकता है टूट कोड के बारे में सवालों के साथ वेब भर सकते हैं ...

हालांकि, प्रश्न पर वापस जाएं: यदि आप जेपीए का उपयोग कर रहे हैं, तो आपकी समस्या का एक समाधान डेटा न्यूक्लियस/जेपीए का उपयोग करना है जो डेटा न्यूक्लियस/जेडीओ (स्वच्छ अंतर्निहित कार्यान्वयन - कोई प्रॉक्सी नहीं, कोई जवासिस्ट कक्षाएं आदि के कई लाभ लाता है। ,) एक जेपीए अनुपालन कार्यान्वयन में - यानी आपको इसका उपयोग शुरू करने के लिए अपने मौजूदा स्रोत कोड को बदलने की आवश्यकता नहीं है।

1

यदि आप स्थिर विधि पर कॉल करते हैं: हाइबरनेट प्रोक्सहेल्पर।getClassWithoutInitializingProxy (इकाई); यदि आप प्रॉक्सी नहीं किया गया है तो आपको प्रॉक्सीकृत इकाई और कक्षा का वर्ग मिल जाएगा।