एक @GeneratedValue प्रकार id आप (वास्तव में यह लिखने से पहले) पहले से है कि मूल्य में पता नहीं कर सकते हैं
की तरह कुछ करना चाहते हैं। हालांकि, जब आप अपने बीन को बरकरार रखते हैं, तो आईडी फ़ील्ड उस बीन इंस्टेंस में पॉप्युलेट हो जाएगी और आप इसके लिए अतिरिक्त क्वेरी करने के बिना इसे प्राप्त कर सकते हैं। दूसरे शब्दों में:
MyEntiry myEnt = new MyEntity(); //the id field is null now
entityManager.persist(myEnt);//the id field is populated in myEnt now
Long id = myEnt.getId();
इसके अलावा, आपके EntityManager
कैसे कॉन्फ़िगर किया गया है पर निर्भर करता है, आप भी पहले लेनदेन (स्वयं) प्रतिबद्ध करने के लिए इससे पहले कि आप कि आईडी प्राप्त कर सकते हैं की आवश्यकता हो सकती।
टिप्पणी के अनुसार अद्यतन
आप रोकना और बाद ही उसे सहेजा और/या अद्यतन किया जाता है संस्था के लिए कुछ करने के लिए, आप (आप जेपीए संस्करण 2 का उपयोग कर रहे हैं) जेपीए जीवनचक्र श्रोताओं का उपयोग कर सकते हैं: Handling JPA lifecycle event using listeners and callbacks ।
मूल रूप से आप अपने सेम में एक validate()
विधि बना सकते हैं, @PrePersist
और @PreUpdate
साथ उस पर टिप्पणी और
2 टिप्पणी प्रति अद्यतन (यदि कोड खाली सेट यह आईडी के मूल्य के लिए है) उस में सत्यापन करना
हां, मैंने ईमानदारी से अभी सोचा है कि अगर आईडी स्वचालित रूप से जेनरेट की गई है, तो यह प्री-पर्सिस्ट इवेंट के बाद आबादी हो सकती है, जैसे कि जब आपका प्री-पर्सिस्ट कोड निष्पादित होता है तब भी आप नहीं जानते कि आईडी क्या है (आप यह भी ध्यान दे सकते हैं कि उदाहरण के लिए आप आईडी से लिंक नहीं करते हैं लेकिन स्वचालित रूप से सेट नहीं होते हैं)। इस मामले में आप क्या कर सकते हैं अपनी इकाई में एक बुलियन फ़ील्ड जोड़ें (@Transient
के साथ एनोटेटेड है, इसलिए यह जारी नहीं रहेगा) जिसे isCodeEmpty
कहा जाता है (जो विशेष रूप से प्रारंभ नहीं होने पर डिफ़ॉल्ट रूप से गलत है)। फिर आपके @PrePersist
एनोटेटेड विधि में आप जांचते हैं कि कोड फ़ील्ड का मान खाली है या नहीं, और यदि ऐसा है, तो बूलियन को सत्य पर सेट करें। तो फिर तुम (आईडी क्षेत्र की स्थापना को छोड़ कर) ऐसी है कि आपके setId(...)
विधि refactor यह इस बूलियन की जाँच करेगा, और अगर सच सेट आईडी क्षेत्र की है कि कोड फ़ील्ड का मान:
public class YourEntity {
@Transient
private boolean isCodeEmpty;
public void setId(Whatever id) {
this.id = id;
if(isCodeEmpty) {
this.code = id;
//if necessary:
//this.isCodeEmpty = false;
}
}
@PrePersist
public void validate() {
if(code == null || code.isEmpty()) {
isCodeEmpty = true;
}
}
}
स्रोत
2012-10-05 09:02:09
आप @GeneratedValue से बचने, जनरेटर खुद का उपयोग मूल्य प्राप्त करने और "मैन्युअल" संस्था के लिए यह सेट कर सकते हैं – SJuan76
मैं न यहाँ सरल कार्यान्वयन है इसे मैन्युअल रूप से इकाई में सेट करना चाहते हैं। अगर मुझे ऑरैकल से आईडी के लिए अगला मान मिलता है और मैं इसे नई इकाई की आईडी पर सेट करता हूं, तो क्या यह तर्कसंगत है? – mstzn