हाल ही में, जब मैंने हाइबरनेट में आलसी आरोपण के खिलाफ लड़ाई के बारे में हेबर पर एक
पोस्ट देखी, तो मुझे दिलचस्पी हुई - मैंने खुद पोस्ट पढ़ी और जब तक मुझे और टिप्पणियां नहीं मिलीं, तब तक इंतजार किया - क्या कोई इस समस्या को हल करने का कोई तरीका सुझाएगा? मुझे ऐसा कुछ दिखाई नहीं दे रहा था। कटौती के तहत विधि।
मैं एक उदाहरण के साथ वर्णन करूंगा। मान लीजिए कि एक इकाई है:
@Entity public class Person { @Id private long id; private String firstName; private String lastName; @OneToMany private List<Person> children;
हम यह सुनिश्चित करना चाहते हैं कि जब इस इकाई का प्रतिनिधित्व ग्राहक को भेजा जाए, तो बच्चों की सूची को आरंभीकृत किया जाता है और इसके अलावा, किसी भी हाइबरनेट गेटर्स को नहीं खींचता है। ऐसा करने के लिए, निम्नलिखित इंटरफ़ेस घोषित करें:
public interface IPerson { public long getId(); public void setId(long id);
यह वह दृश्य है जिसे क्लाइंट को भेजा जाएगा। ध्यान दें कि व्यक्ति IPerson को लागू नहीं करता है। और ग्राहक को व्यक्ति के अस्तित्व के बारे में बिल्कुल भी पता नहीं है। उसके लिए, इंटरफेस के रूप में उसके केवल विभिन्न प्रतिनिधित्व हैं। इस तरह दिखता है:
Person examplePerson = getPersonFromDb(); IPerson personProxy = ProxyFactory.getProxy(IPerson.class, examplePerson);
यह कैसे काम करता है? ProxyFactory.getProxy () विधि गतिशील प्रॉक्सी तंत्र का उपयोग करते हुए, आइपर्सन इंटरफ़ेस के कार्यान्वयन, हैंडलर में, जिसमें फ़ील्ड मानों के साथ मैप निहित है, का उपयोग करता है। इस नक्शे को भरने के लिए, ProxyFactory इकाई क्षेत्र के उदाहरणPPerson का प्रतिबिंब पढ़ता है। तदनुसार, जब किसी भी गेट्टर / सेटर को इंटरफ़ेस पर बुलाया जाता है, तो हैंडलर इस नक्शे में रेंगता है।
स्वाभाविक रूप से, एक इकाई में कई इंटरफेस हो सकते हैं, और परदे के पीछे खेतों का ही हिस्सा हो सकता है। एक सूची वाली स्थिति के लिए (उदाहरण के रूप में सूची <IPerson>), आप यह भी निर्दिष्ट कर सकते हैं कि सूची में कौन-कौन सम्मिलित हैं (उदाहरण के लिए, सूची <IPersonOnlyWithName>)।
संकलन चरण में प्रॉक्सी इंटरफेस (कि इंटरफ़ेस वास्तव में इकाई से मेल खाती है) की जांच करने के लिए, ग्रहण के लिए एक सरल चींटी-बिल्डर लिखा गया था, जो निम्नानुसार एनोटेट की गई संस्थाओं से गुजरता है:
@Entity @ProxyBinding(interfaceClass = IPerson.class) public class Person {
इस दृष्टिकोण ने व्यवहार में इसकी व्यवहार्यता साबित कर दी है और कई प्रकार के परिवर्धन प्राप्त किए हैं। कुछ रचनात्मक आलोचना और टिप्पणियों को देखना दिलचस्प होगा।