JPA के पास @Transient एनोटेशन क्यों है?


283

जावा में transientकीवर्ड है। जेपीए के पास @Transientपहले से मौजूद जावा कीवर्ड का उपयोग करने के बजाय क्यों है ?

जवाबों:


455

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


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

1
यकीन नहीं हो रहा है कि मैं आपको समझ रहा हूं, लेकिन "पास्कल थिवेंट" के जवाब पर एक नज़र है;)
जौहरी

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

1
"जेपीए कैशिंग सिस्टम" जो स्टोर / संस्थाओं को बहाल करने के लिए क्रमांकन का उपयोग करता है? एक जेपीए कार्यान्वयन किसी भी तरह से किसी वस्तु को उनकी इच्छा के अनुसार कैश कर सकता है, और क्रमांकन इसमें प्रवेश नहीं करता है।
डाटा न्यूक्लियस

@ जौहरी, यहां क्षणिक नहीं राष्ट्रपति के लिए किसी भी मूल्य को प्रस्तुत नहीं करने का मतलब है या यह उस विशेषता के लिए डिफ़ॉल्ट मूल्य सम्मिलित करेगा।
सतीश शर्मा

115

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


जवाब पास्कल के लिए धन्यवाद। अपनी टिप्पणी से एक नोट के रूप में: "आप एक @ संपत्ति संपत्ति चाहते हैं और अभी भी इसे क्रमबद्ध कर सकते हैं।" (यही मैं ढूंढ रहा था) मैं यह भी जोड़ना चाहता हूं कि इसके विपरीत सच नहीं है। यदि कोई परिवर्तनशील के रूप में एक चर सेट करता है, तो आप इसे जारी नहीं रख सकते।
jfajunior

96

जैसा कि अन्य लोगों ने कहा है, @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


@psp आप इस बारे में अधिक बता सकते हैं कि अनिर्दिष्ट व्यवहार क्यों / कैसे हो सकता है? धन्यवाद!
tuckuckman

@ 40Plot विनिर्देश में कहा गया है
psp

7
यह IMHO का स्वीकृत उत्तर होना चाहिए क्योंकि यह अधिक स्पष्ट करने वाला है कि वर्तमान ने एक को स्वीकार कर लिया है ...
होन्जा ज़िडेक

53

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

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


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

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

1
इस उत्तर के बारे में मुझे जो पसंद है वह यह है कि इसमें उल्लेख किया गया है कि जेपीए transientखेतों के संबंध में है कि इसका अनाउंसमेंट होता है @Transient। इसलिए यदि आप transientकिसी क्षेत्र के क्रमांकन को रोकने के लिए कीवर्ड का उपयोग करते हैं तो यह डेटाबेस में भी समाप्त नहीं होगा।
नेक्सस

17

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

क्योंकि @ ट्रान्सिएंट क्षेत्र अभी भी क्रमबद्ध हो जाएगा!

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


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

वहाँ एक एनोटेशन है कि जेपा क्षणिक के रूप में इलाज करेगा लेकिन जैक्सन नहीं करेगा?
कल्पेश सोनी

0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.