जवाबों:
जावा के transient
कीवर्ड का उपयोग यह @Transient
बताने के लिए किया जाता है कि किसी क्षेत्र को क्रमबद्ध नहीं किया जाना है, जबकि जेपीए के एनोटेशन का उपयोग यह इंगित करने के लिए किया जाता है कि किसी क्षेत्र को डेटाबेस में बनाए नहीं रखा जाना है, अर्थात उनके शब्दार्थ अलग हैं।
क्योंकि उनके अलग-अलग अर्थ हैं। @Transient
एनोटेशन किसी भी (गैर जारी रहती है नहीं करने के लिए जेपीए प्रदाता बताता है transient
) विशेषता। एक विशेषता को क्रमबद्ध नहीं करने के लिए दूसरा क्रमबद्धता रूपरेखा बताता है। आप एक @Transient
संपत्ति रखना चाहते हैं और अभी भी इसे क्रमबद्ध कर सकते हैं।
जैसा कि अन्य लोगों ने कहा है, @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);
}
}
जब यह वर्ग JPA को खिलाया जाता है, तो यह बना रहता है gender
और यह id
सहायक बूलियन विधियों को जारी रखने का प्रयास नहीं करता है - बिना @Transient
अंतर्निहित प्रणाली से यह शिकायत होगी कि इकाई वर्ग Person
गायब है setMale()
और setFemale()
विधियां इस प्रकार बनी रहेंगी Person
।
उद्देश्य अलग है:
transient
कीवर्ड और @Transient
के साथ एक सौदों: एनोटेशन दो अलग-अलग उद्देश्य होते हैं क्रमबद्धता और के साथ एक सौदों हठ । प्रोग्रामर के रूप में, हम अक्सर इन दो अवधारणाओं को एक में शादी करते हैं, लेकिन यह सामान्य रूप से सटीक नहीं है। दृढ़ता राज्य की विशेषता को संदर्भित करती है जो उस प्रक्रिया को रेखांकित करती है जिसने इसे बनाया था। जावा में क्रमांकन एक बाइट स्ट्रीम के रूप में ऑब्जेक्ट की स्थिति को एन्कोडिंग / डिकोड करने की प्रक्रिया को संदर्भित करता है।
transient
कीवर्ड तुलना में मजबूत स्थिति है @Transient
:
यदि कोई फ़ील्ड transient
कीवर्ड का उपयोग करता है , तो ऑब्जेक्ट बाइट स्ट्रीम में परिवर्तित होने पर उस फ़ील्ड को क्रमबद्ध नहीं किया जाएगा। इसके अलावा, चूँकि जेपीए transient
कीवर्ड के साथ चिह्नित फ़ील्ड को @Transient
एनोटेशन के रूप में मानता है , इसलिए फ़ील्ड को जेपीए द्वारा जारी नहीं किया जाएगा।
दूसरी ओर, @Transient
अकेले खेतों में काटे गए खेतों को एक बाइट स्ट्रीम में बदल दिया जाएगा जब ऑब्जेक्ट धारावाहिक होगा, लेकिन यह जेपीए द्वारा जारी नहीं किया जाएगा। इसलिए, एनोटेशन की transient
तुलना में कीवर्ड एक मजबूत स्थिति है @Transient
।
उदाहरण
यह इस सवाल का जवाब देता है: कोई भी ऐसे क्षेत्र को क्रमबद्ध क्यों करना चाहेगा जो एप्लिकेशन के डेटाबेस से संबंधित नहीं है? वास्तविकता यह है कि क्रमबद्धता का उपयोग केवल दृढ़ता से अधिक के लिए किया जाता है । एंटरप्राइज जावा एप्लिकेशन में वितरित घटकों के बीच वस्तुओं का आदान-प्रदान करने के लिए एक तंत्र होने की आवश्यकता है ; क्रमबद्धता इसे संभालने के लिए एक आम संचार प्रोटोकॉल प्रदान करती है। इस प्रकार, एक क्षेत्र अंतर-घटक संचार के उद्देश्य के लिए महत्वपूर्ण जानकारी रख सकता है; लेकिन उसी क्षेत्र में दृढ़ता के दृष्टिकोण से कोई मूल्य नहीं हो सकता है।
उदाहरण के लिए, मान लें कि एक अनुकूलन एल्गोरिथ्म एक सर्वर पर चलाया जाता है, और मान लें कि इस एल्गोरिथ्म को पूरा होने में कई घंटे लगते हैं। किसी क्लाइंट के लिए, समाधानों का सबसे अद्यतित होना महत्वपूर्ण है। इसलिए, एक क्लाइंट सर्वर की सदस्यता ले सकता है और एल्गोरिथम के निष्पादन चरण के दौरान आवधिक अपडेट प्राप्त कर सकता है। ये अद्यतन 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
।
@Unpersisted
।
@Ephemeral
। मेरियम वेबस्टर के अनुसार: जब 1600 के दशक में पहली बार अंग्रेजी में पंचांग छपा था, "यह एक वैज्ञानिक शब्द था जिसे अल्पकालिक बुखार के लिए लागू किया गया था, और बाद में, जीवों (जैसे कीड़े और फूल) के साथ बहुत ही कम जीवन अवधि के लिए। , इसने कुछ भी क्षणभंगुर और अल्पकालिक (जैसा कि "अल्पकालिक सुख") का उल्लेख करते हुए एक विस्तारित भावना का अधिग्रहण किया।
transient
खेतों के संबंध में है कि इसका अनाउंसमेंट होता है @Transient
। इसलिए यदि आप transient
किसी क्षेत्र के क्रमांकन को रोकने के लिए कीवर्ड का उपयोग करते हैं तो यह डेटाबेस में भी समाप्त नहीं होगा।
यदि आप चाहते हैं कि एक क्षेत्र कायम न रहे, तो दोनों क्षणिक और @ क्षणिक काम करते हैं। लेकिन सवाल यह है कि क्षणिक के बाद से @Transient पहले से मौजूद क्यों है।
क्योंकि @ ट्रान्सिएंट क्षेत्र अभी भी क्रमबद्ध हो जाएगा!
मान लीजिए कि आप एक इकाई बनाते हैं, परिणाम प्राप्त करने के लिए कुछ सीपीयू-खपत गणना करते हैं और यह परिणाम डेटाबेस में नहीं बचाएगा। लेकिन आप JMS द्वारा उपयोग करने के लिए अन्य जावा अनुप्रयोगों के लिए इकाई भेजना चाहते हैं, तो आपको @Transient
JavaSE कीवर्ड का उपयोग करना चाहिए transient
। तो अन्य वीएम पर चलने वाले रिसीवर फिर से गणना करने के लिए अपना समय बचा सकते हैं।
मैं "क्यों" के प्रश्न का उत्तर देने का प्रयास करूंगा। ऐसी स्थिति की कल्पना करें जहां आपके पास एक तालिका में बहुत सारे स्तंभों के साथ एक विशाल डेटाबेस है, और आपकी परियोजना / प्रणाली डेटाबेस से संस्थाओं को उत्पन्न करने के लिए उपकरणों का उपयोग करती है। (हाइबरनेट के पास वे हैं, आदि ...) अब, मान लीजिए कि आपके व्यावसायिक तर्क से आपको किसी विशेष क्षेत्र की आवश्यकता नहीं है। आपको अपनी इकाई को एक विशेष तरीके से "कॉन्फ़िगर" करना होगा। जबकि क्षणिक कीवर्ड एक वस्तु पर काम करता है - जैसा कि यह एक जावा भाषा के भीतर व्यवहार करता है, @ ट्रान्सिएंट केवल उन कार्यों का उत्तर देने के लिए डिज़ाइन किया गया है जो केवल दृढ़ता कार्यों से संबंधित हैं।