Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

jpa . में किसी ऑब्जेक्ट को सहेजने से पहले मैं आईडी कैसे जानूं?

@GeneratedValue प्रकार आईडी के साथ आप उस मान को पहले से नहीं जान सकते (वास्तव में इसे लिखने से पहले)। हालांकि एक बार जब आप अपना बीन जारी रखते हैं, तो आईडी फ़ील्ड उस बीन इंस्टेंस में पॉप्युलेट हो जाएगी और आप इसके लिए अतिरिक्त क्वेरी किए बिना इसे प्राप्त कर सकते हैं। दूसरे शब्दों में:

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 का उपयोग कर रहे हैं):श्रोताओं और कॉलबैक का उपयोग करके जेपीए लाइफसाइकिल ईवेंट को संभालना।

मूल रूप से आप एक validate() . बना सकते हैं अपने बीन में विधि, इसे @PrePersist . के साथ एनोटेट करें और @PreUpdate और इसमें सत्यापन करें (यदि कोड खाली है तो इसे आईडी के मान पर सेट करें)

प्रति दूसरी टिप्पणी अपडेट करें

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

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;
 }

}


}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ऑरैकल में एक कॉलम में सबसे लंबी पंक्ति की लंबाई पाएं

  2. एसक्यूएल दिनांक वस्तु के लिए जावास्क्रिप्ट दिनांक

  3. 11i/R12 . में बहु भाषा समर्थन

  4. Oracle में एक तिथि के लिए सामान्य संकेतक जोड़ें

  5. मेरी OOW15 यात्रा पूरी हो गई है