2011-12-28 18 views
5

मान लीजिए मैं एक User इकाई इस तरह है:hbm.xml में मैप किए गए गुण क्षणिक हो सकते हैं?

class User { 
    private String login; 
    transient private String hashedPassword; 
} 

मैं नहीं चाहता कि कभी ग्राहकों को hashedPassword हस्तांतरण करने के लिए, तो मैं यह क्षणिक हैं।

इस वर्ग को हाइबरनेट द्वारा मैप किया गया है, दोनों फ़ील्ड hbm.xml में मैप किए गए हैं।

क्या यह कार्यान्वयन सुरक्षित और सही है? डेटाबेस में hashedPassword सही ढंग से संग्रहीत करेगा, इसे डेटाबेस से ऑब्जेक्ट्स में लोड करें, इसे दोहराए गए दूसरे स्तर के कैश और स्थानीय सत्र कैश इत्यादि में रखें?

शब्दों के क्रम में, हाइबरनेट या द्वितीय स्तर कैश सम्मान transient किसी भी तरह से या पूरी तरह से अनदेखा करता है?

संपादित करें: मुझे पहले से ही दो उत्तरों मिल गए हैं जिनमें समीकरण के एक विशिष्ट पहलू को शामिल नहीं किया गया है। मैं एनोटेशन का उपयोग नहीं कर रहा हूं, केवल hbm.xml में एक्सएमएल मैपिंग्स। और यह जावा-क्षणिक फ़ील्ड hbm.xml में OR-mapped है।

उत्तर

3

ऐसा लगता है कि हाइबरनेट transient कीवर्ड के साथ एक फ़ील्ड नहीं टिकेगा, भले ही आपके पास अन्य टिप्पणियां हों।

अलग @Transient एनोटेशन आप हाइबरनेट निर्देशित करने के लिए दृढ़ता के लिए एक गैर क्षणिक फ़ील्ड को अनदेखा करने की अनुमति देगा, लेकिन मैं इसे जारी रहती है एक transient क्षेत्र हाइबरनेट होने के विपरीत करना संभव नहीं है नहीं लगता।

इसी प्रकार यहां चर्चा:

JPA - using annotations in a model

Annotation @Basic to transient variables

ऊपर के माध्यम से सबसे अधिक प्रासंगिक बोली, जेपीए 2.0 से कल्पना: "मानचित्रण एनोटेशन क्षेत्रों या गुण हैं कि करने के लिए लागू नहीं किया जाना चाहिए transient या @Transient । "

+0

धन्यवाद, लेकिन मैं विशेष रूप से उल्लेख किया है कि क्षेत्र hbm.xml में मैप किया गया है। मैं एनोटेशन पर मुकदमा नहीं कर रहा हूं। –

+0

क्या हाइबरनेट वास्तव में उस मामले में संपत्ति को मानचित्र करता है? मैं इस धारणा के तहत था कि एनोटेशन और एचबीएम.एक्सएमएल ने वही व्यवहार किया, लेकिन शायद यह मामला नहीं है। चूंकि 'क्षणिक 'यह सुनिश्चित करेगा कि संपत्ति धारावाहिक नहीं है, क्या आपका प्रश्न पूरी तरह से हाइबरनेट व्यवहार के बारे में है? – wrschneider

7

अप्रयुक्त/क्षणिक गुण हाइबरनेट द्वारा सहेजे नहीं जाते हैं।

हाइबरनेट मानक जावा क्षणिक संशोधक के महत्व को समझता है - लेकिन यदि आप चुनते हैं तो आप @ ट्रांसिएंट एनोटेशन का उपयोग करके क्षणिक के रूप में गुणों को एनोटेट करने की अनुमति भी देते हैं ... या बस अपनी मैपिंग फ़ाइल से फ़ील्ड को पूरी तरह से छोड़ दें।

आपके मामले में, आपको शायद कुछ भी विशेष करने की आवश्यकता नहीं होगी, हाइबरनेट को अनदेखा फ़ील्ड को अनदेखा करके बस "सही काम करें" चाहिए।

तो: - अगर केवल hbm.xml

1 का उपयोग कर

) मैप नहीं गुण हाइबरनेट द्वारा बचाया नहीं गया है - सबक यहाँ सीखा वे प्रभावी रूप से क्षणिक होते हैं।

तो POJOs का उपयोग कर

2) हाइबरनेट "@Transient" एनोटेट चर बचत पर ध्यान नहीं देगा:

@Transient 
int ignored=0; 

3) हाइबरनेट भी मानक "क्षणिक" संशोधक के साथ बचत चरों की उपेक्षा:

private transient int ignored =0; 

इस का एक बहुत अच्छा विवरण के लिए http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/ देखें।

+0

धन्यवाद, लेकिन मैं विशेष रूप से उल्लेख किया है कि क्षेत्र hbm.xml में मैप किया गया है। मैं एनोटेशन पर मुकदमा नहीं कर रहा हूं। –

+0

हाँ thats true- POJO एनोटेशन सामान अप्रासंगिक है। मैंने आपके प्रश्न को हल करने के लिए एक गोली जोड़ा। किसी भी मामले में - यह सरल है, बस अपने मानचित्र से परिवर्तनीय छोड़ दें - और हाइबरनेट दूसरे तरीके से दिखाई देगा। कोई बचत या कैशिंग नहीं की जाएगी, क्योंकि आपके ऑब्जेक्ट के हाइबरनेट के "मानचित्र" में असमर्थित चर शामिल नहीं होगा। – jayunit100

+0

धन्यवाद जय, लेकिन मेरा बिंदु काफी विपरीत है। मैं चाहे वह हमेशा सुरक्षित, 2 lv कैश और whatnot है पूछ रहा हूँ, hbm.xml साथ मैप की एक क्षणिक POJO क्षेत्र है। –

0

यहाँ मैं क्या सोचता है - हाइबरनेट केवल मैपिंग तकनीक है। जब आप एक क्षेत्र को ट्रांजिन्टेंट के रूप में चिह्नित करते हैं तो यह जावा द्वारा जारी नहीं रहेगा। और चूंकि इसकी स्थिति कायम नहीं है, क्यों इसे एल 2 कैश आदि में बनाए रखने के लिए हाइबरनेट करना चाहिए? इसलिए यदि आप hbm फ़ाइल में क्षणिक फ़ील्ड को मैप करते हैं तो भी हाइबरनेट को कोई समस्या नहीं होनी चाहिए।

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