2010-01-28 16 views
205

जावा में transient कीवर्ड है। जेपीए के पास पहले से ही मौजूदा जावा कीवर्ड का उपयोग करने के बजाय @Transient क्यों है? जबकि जेपीए के @Transient एनोटेशन दर्शाता है कि एक क्षेत्र नहीं है डेटाबेस में कायम किया जाना है, अर्थात उनके अर्थ विज्ञान अलग हैं प्रयोग किया जाता हैजेपीए में @ ट्रांसिएंट एनोटेशन क्यों है?

उत्तर

315

जावा के transient कीवर्ड, निरूपित करने के लिए है कि एक क्षेत्र धारावाहिक जा नहीं है प्रयोग किया जाता है।

+1

हां, अर्थशास्त्र अलग हैं। लेकिन जेपीए इस तरह से डिजाइन क्यों किया गया था? –

+1

यकीन नहीं है कि मैं आपको समझ रहा हूं, लेकिन "पास्कल थिवेंट" के उत्तर पर एक नज़र डालें;) – Jawher

+18

यह आसान है क्योंकि आप डेटाबेस में डेटा स्टोर नहीं करना चाहते हैं, लेकिन आप इसे जेपीए में स्टोर करना चाहते हैं चैचिंग सिस्टम जो इकाइयों की दुकान/बहाली के लिए क्रमबद्धता का उपयोग करता है। – Kdeveloper

96

क्योंकि उनके पास अलग-अलग अर्थ हैं। @Transient एनोटेशन जेपीए प्रदाता को किसी भी (गैर- transient) विशेषता को जारी रखने के लिए कहता है। दूसरा एक विशेषता को क्रमबद्ध करने के लिए धारावाहिक ढांचे को बताता है। आप @Transient संपत्ति चाहते हैं और अभी भी इसे क्रमबद्ध कर सकते हैं।

71

जैसा कि अन्य ने कहा है, @Transient उन क्षेत्रों को चिह्नित करने के लिए उपयोग किया जाता है जिन्हें जारी नहीं रखा जाना चाहिए। इस छोटे से उदाहरण पर विचार करें:

public enum Gender { MALE, FEMALE, UNKNOWN } 

@Entity 
public Person { 
    private Gender g; 
    private long id; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public long getId() { return id; } 
    public void setId(long id) { this.id = id; } 

    public Gender getGender() { return g; }  
    public void setGender(Gender g) { this.g = g; } 

    @Transient 
    public boolean isMale() { 
     return Gender.MALE.equals(g); 
    } 

    @Transient 
    public boolean isFemale() { 
     return Gender.FEMALE.equals(g); 
    } 
} 

जब इस वर्ग जेपीए को खिलाया जाता है, यह बनी रहती है gender और id लेकिन सहायक बूलियन तरीकों बने रहने की कोशिश नहीं करता है - अंतर्निहित प्रणाली शिकायत करेगा @Transient बिना कि इकाई वर्ग PersonsetMale() और setFemale() विधियों की अनुपलब्ध है और इस प्रकार Person पर भी जारी नहीं रहेगा।

+0

@psp क्या आप इस बारे में अधिक समझा सकते हैं कि यह अनिश्चित व्यवहार क्यों कर सकता है? धन्यवाद! – 40Plot

+0

@ 40 प्लॉट विनिर्देश बताता है कि – psp

+4

यह स्वीकृत उत्तर IMHO होना चाहिए क्योंकि यह और अधिक समझाता है कि वर्तमान स्वीकृत एक ... –

11

तुम सिर्फ चाहते हैं एक क्षेत्र कायम नहीं किया जाएगा, दोनों क्षणिक और @Transient काम करते हैं। लेकिन सवाल यह है कि @ ट्रांसिएंटक्षणिक पहले से मौजूद है।

क्योंकि @ ट्रांसिएंट फ़ील्ड अभी भी क्रमबद्ध हो जाएगा!

मान लीजिए कि आप एक इकाई बनाते हैं, परिणाम प्राप्त करने के लिए कुछ CPU उपभोग करने वाली गणना करते हैं और यह परिणाम डेटाबेस में सहेज नहीं पाएगा। लेकिन आप जेएमएस द्वारा उपयोग करने के लिए इकाई को अन्य जावा अनुप्रयोगों में भेजना चाहते हैं, तो आपको @Transient का उपयोग करना चाहिए, जावाएसई कीवर्ड transient नहीं। तो अन्य वीएम पर चल रहे रिसीवर अपने समय को फिर से गणना करने के लिए बचा सकते हैं।

+0

क्या आप इसे और स्पष्ट करने के लिए उदाहरण प्रदान कर सकते हैं? –

0

मैं "क्यों" के प्रश्न का उत्तर देने का प्रयास करूंगा। ऐसी परिस्थिति की कल्पना करें जहां आपके पास एक तालिका में बहुत सारे कॉलम के साथ एक विशाल डेटाबेस है, और आपका प्रोजेक्ट/सिस्टम डेटाबेस से इकाइयों को उत्पन्न करने के लिए टूल का उपयोग करता है। (हाइबरनेट में उन, आदि हैं ...) अब, मान लीजिए कि आपके व्यवसाय तर्क से आपको एक विशेष क्षेत्र की आवश्यकता है, न कि बने रहें। आपको अपनी इकाई को किसी विशेष तरीके से "कॉन्फ़िगर" करना होगा। जबकि क्षणिक कीवर्ड किसी ऑब्जेक्ट पर काम करता है - क्योंकि यह जावा भाषा में व्यवहार करता है, तो @ ट्रांसिएंट केवल उन कार्यों का उत्तर देने के लिए डिज़ाइन किया गया है जो केवल दृढ़ता कार्यों से संबंधित हैं।

26

उद्देश्य अलग है:

transient कीवर्ड और @Transient एनोटेशन दो अलग-अलग उद्देश्य होते हैं: क्रमबद्धता के साथ एक सौदे और हठ के साथ एक से संबंधित है। प्रोग्रामर के रूप में, हम अक्सर इन दो अवधारणाओं को एक में शादी करते हैं, लेकिन यह सामान्य रूप से सटीक नहीं है। Persistence उस राज्य की विशेषता को संदर्भित करता है जो इसे बनाने वाली प्रक्रिया को आगे बढ़ाता है।जावा में Serialization किसी ऑब्जेक्ट के राज्य को एन्कोडिंग/डीकोडिंग की प्रक्रिया को बाइट स्ट्रीम के रूप में संदर्भित करता है।

एक क्षेत्र transient कीवर्ड का उपयोग करता है, तो उस क्षेत्र जब वस्तु एक बाइट धारा में बदल जाती है धारावाहिक नहीं किया जाएगा:

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

दूसरी ओर, क्षेत्रों अकेले @Transient एनोटेट होगा एक बाइट धारा में परिवर्तित हो जब वस्तु धारावाहिक है, लेकिन यह जेपीए से कायम नहीं किया जाएगा। इसलिए, transient कीवर्ड @Transient एनोटेशन की तुलना में एक मजबूत स्थिति है।

उदाहरण

यह सवाल भीख माँगता: क्यों किसी को भी एक क्षेत्र है कि आवेदन के डेटाबेस के लिए कायम नहीं कर रहा है क्रमानुसार करने चाहेगा? वास्तविकता यह है कि क्रमबद्धता केवल से अधिक के लिए उपयोग की जाती है। एंटरप्राइज़ जावा एप्लिकेशन में वितरित घटकों के बीच ऑब्जेक्ट्स का आदान-प्रदान करने के लिए एक तंत्र होना आवश्यक है; serialization इसे संभालने के लिए एक आम संचार प्रोटोकॉल प्रदान करता है। इस प्रकार, एक क्षेत्र अंतर-घटक संचार के उद्देश्य के लिए महत्वपूर्ण जानकारी रख सकता है; लेकिन उसी क्षेत्र में दृढ़ता परिप्रेक्ष्य से कोई मूल्य नहीं हो सकता है।

उदाहरण के लिए, मान लें कि एक अनुकूलन एल्गोरिदम सर्वर पर चलाया जाता है, और मान लीजिए कि इस एल्गोरिदम को पूरा होने में कई घंटे लगते हैं। एक ग्राहक के लिए, समाधान का सबसे अद्यतित सेट होना महत्वपूर्ण है। इसलिए, एक ग्राहक सर्वर की सदस्यता ले सकता है और एल्गोरिदम के निष्पादन चरण के दौरान आवधिक अद्यतन प्राप्त कर सकता है। ये अद्यतन ProgressReport वस्तु का उपयोग कर प्रदान की जाती हैं:

@Entity 
public class ProgressReport implements Serializable{ 

    private static final long serialVersionUID = 1L; 

    @Transient 
    long estimatedMinutesRemaining; 
    String statusMessage; 
    Solution currentBestSolution; 

} 

Solution वर्ग इस प्रकार दिखाई देंगे:

@Entity 
public class Solution implements Serializable{ 

    private static final long serialVersionUID = 1L; 

    double[][] dataArray; 
    Properties properties; 
} 

सर्वर अपने डेटाबेस के लिए प्रत्येक ProgressReport बनी हुई है। सर्वर estimatedMinutesRemaining को जारी रखने की परवाह नहीं करता है, लेकिन ग्राहक निश्चित रूप से इस जानकारी की परवाह करता है। इसलिए, estimatedMinutesRemaining@Transient का उपयोग करके एनोटेट किया गया है। जब अंतिम Solution एल्गोरिदम द्वारा स्थित होता है, तो यह ProgressReport का उपयोग किये बिना सीधे जेपीए द्वारा जारी रहता है।

+0

यदि वे वास्तव में अलग-अलग चिंताओं हैं, निश्चित रूप से एक अलग शब्द मौजूद है जो बारीकियों को पकड़ता है। शब्द अधिभार क्यों करें? स्टार्टर सुझाव के रूप में, '@ अप्रत्याशित'। –

+1

मुझे व्यक्तिगत रूप से '@ एफेमेरल' पसंद है। मरियम वेबस्टर के अनुसार: जब 1600 के दशक में पहली बार अंग्रेजी में मुद्रित किया गया था, "यह अल्पकालिक बुखारों के लिए एक वैज्ञानिक शब्द था, और बाद में, बहुत कम जीवन काल के साथ जीवों (जैसे कि कीड़े और फूल) के लिए लागू किया गया था। इसके तुरंत बाद , यह किसी भी क्षणिक और अल्पकालिक (जैसा कि "क्षणिक सुख" में) के संदर्भ में एक विस्तारित अर्थ प्राप्त हुआ। " –

+0

बहुत अच्छी व्याख्या! – GOXR3PLUS

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