2010-05-06 13 views
26

मेरे पास मेरे एप्लिकेशन की वेब यूआई परत में एक जेपीए इकाई उदाहरण है। मैं किसी भी समय जानना चाहूंगा कि यह इकाई डेटाबेस में पहले से ही जारी है या यदि यह केवल उपयोगकर्ता सत्र में मौजूद है।कैसे पता चलेगा कि एक अलग जेपीए इकाई पहले से ही जारी है या नहीं?

यह व्यापार परत में होगा, मैं entitymanager.contains (इकाई) विधि का उपयोग करूंगा, लेकिन मेरी यूआई परत में मुझे लगता है कि मुझे एक अतिरिक्त विशेषता की आवश्यकता है जो इंगित करता है कि इकाई को सहेजा गया है या नहीं। इसे कैसे कार्यान्वित करें? मैं पल के लिए विकल्प निम्नलिखित पर विचार कर रहा हूँ:

  • डेटाबेस द्वारा निर्धारित एक डिफ़ॉल्ट मान के साथ एक जेपीए विशेषता है, लेकिन हर अद्यतन के बाद एक नया पढ़ने के लिए मजबूर हैं?
  • एक गैर जेपीए विशेषता मैन्युअल रूप से मेरे कोड में सेट या स्वचालित रूप से जेपीए द्वारा सेट?

कोई सलाह/अन्य सुझाव?

मैं जेबए 1 का उपयोग हाइबरनेट 3.2 कार्यान्वयन के साथ कर रहा हूं और मानक के साथ छड़ी पसंद करूंगा।

उत्तर

44

सबसे पहले, आइए किसी इकाई के विभिन्न राज्यों को याद दिलाएं। जेपीए 1.0 विनिर्देश (खंड में 3.2 इकाई उदाहरण के जीवन चक्र) से:

यह खंड एक इकाई उदाहरण के जीवनचक्र के प्रबंधन के लिए EntityManager कार्यों का वर्णन। इकाई उदाहरण को नए, प्रबंधित, अलग, या हटाए जाने के रूप में चिह्नित किया जा सकता है।

  • एक नई इकाई उदाहरण कोई लगातार पहचान है, और अभी तक एक हठ संदर्भ के साथ संबद्ध नहीं है।
  • एक कामयाब इकाई उदाहरण एक लगातार पहचान है कि वर्तमान में एक हठ संदर्भ साथ जुड़ा हुआ है के साथ एक उदाहरण है।
  • एक अलग इकाई उदाहरण एक लगातार पहचान कि एक हठ संदर्भ के साथ जुड़ा नहीं है (या नहीं रह गया है) के साथ एक उदाहरण है।
  • हटाया गया इकाई उदाहरण निरंतर पहचान के साथ एक उदाहरण है, जो दृढ़ता संदर्भ से जुड़ा हुआ है, जो डेटाबेस से हटाने के लिए निर्धारित है।

और एक ग्राफिकल चित्रण:

alt text

तो, परिभाषा के द्वारा, एक अलग इकाई पहले से कायम किया गया है, और मैं वास्तव में नहीं लगता है कि यह अपने असली सवाल है।

@Transient 
public boolean isNew() { 
    return (this.id == null); 
} 
+0

बिल्कुल, मैं अगर मेरी इकाई नया है जानना चाहता हूँ: अब, अगर आप जानना चाहते हैं, तो एक इकाई नई है, क्या इस बारे में (अर्थात किसी भी लगातार पहचान नहीं है)।मैं डेटाबेस में डिफ़ॉल्ट मान सेट के साथ किसी अन्य फ़ील्ड का उपयोग करना पसंद करूंगा क्योंकि मैं प्राथमिक कुंजी के लिए जेपीए जेनरेटेड वैल्यू रणनीति का उपयोग नहीं कर रहा हूं (मैं अपने आप को क्रॉस डेटाबेस विक्रेता/जेपीए कार्यान्वयन/क्लस्टरिंग संगतता के लिए यूयूआईडी के साथ प्राथमिक कुंजी सेट कर रहा हूं)। – snowflake

+2

@nownowflake समस्या यह है कि जेपीए गैर पीके विशेषताओं के लिए डेटाबेस जेनरेटेड मानों का समर्थन नहीं करता है, इसलिए आपको एक जेपीए प्रदाता एक्सटेंशन (जैसे '@ org.hibernate.annotations.Generated') का उपयोग करना होगा या लगातार बने रहने के बाद अपनी इकाइयों को रीफ्रेश करना होगा , जो बदसूरत है। मुझे आश्चर्य है कि '@ जेनरेटेड वैल्यू' का उपयोग करना बेहतर विकल्प नहीं होगा। –

+0

आपकी टिप्पणी के लिए धन्यवाद। आप सही हैं यह बदसूरत है, मैं अपने डीएओ द्वारा और एक वैकल्पिक सेट के रूप में उपयोग करना पसंद करूंगा। – snowflake

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