java - Auto generate unique random string in Spring MVC + Hibernate -


पृष्ठभूमि

मैं स्प्रिंग MVC (फ्रेमवर्क v4.0.6.RELEASE, JPA का उपयोग कर एक प्रोजेक्ट लिख रहा हूँ V1.6.2.RELEASE) और हाइबरनेट (कोर v4.3.6.FINAL, जेपीए एपीआई v2.1)। मेरी परियोजना में, 'परियोजना' नामक संस्थाएं हैं इनमें से प्रत्येक प्रोजेक्ट की अपनी अद्वितीय, ऑटो-जनरेटेड आईडी प्राथमिक कुंजी के रूप में है। यह आईडी निम्न कोड द्वारा उत्पन्न होती है:

  @ आईडी @ कॉलम (नाम = "प्रोजेक्ट_आईड") @ जनरेटेड वैल्यू (रणनीति = जनरेशन टाइप। एओटीओ) निजी लंबी परियोजना आईडी;  

यह कोड अपेक्षा के अनुरूप काम करता है और स्वचालित रूप से अद्वितीय आईडी बनाता है।

समस्या

इन परियोजनाओं में से प्रत्येक को यादृच्छिक, अनोखा 1 'गुप्त' स्ट्रिंग होना चाहिए, ठीक उसी तरह एफ़आईपी प्रदाताओं जैसे फेसबुक, ट्विटर, इत्यादि द्वारा सौंपा। तो, इसे प्राप्त करने के लिए, मैं हाइबरनेट डॉक्स के अनुसार निम्न कोड का उपयोग करने की कोशिश की:

  @Column (name = "project_secret", nullable = गलत, अद्वितीय = सच) @GenericGenerator (नाम = "uuid-gen", strategy = "uuid") @ generatedValue (जनरेटर = "uuid-gen") निजी स्ट्रिंग प्रोजेक्ट गुप्त;  

हालांकि, जब भी मैं एक नई परियोजना इकाई बनाने की कोशिश करता हूं, मुझे एक org.springframework.dao.DataIntegrityViolationException मूल कारण से स्वागत किया जाता है:

  com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: कॉलम 'project_secret' रिक्त नहीं हो सकता  

यह होना चाहिए निर्माण पर सीतनिद्रा में होना द्वारा स्वत: उत्पन्न, यादृच्छिक और अद्वितीय 1 होना चाहिए एक 128-बिट यूयूआईडी मेरे लिए पर्याप्त है (32 अक्षर डैश / डैश) और मैंने पढ़ा है कि सीतनिद्रा में होना एक यूयूआईडी जनरेटर है, इसलिए मैं इसका उपयोग करने के लिए लक्ष्य कर रहा हूं।

अधिक जानकारी

< P> घंटों के लिए खोज करने के बाद, मैं इसे सुलझाने के करीब नहीं हूं जिस तरह से मैं ऐसा करना चाहता हूं मुझे एक संभव समाधान मिला, जिसमें यह शामिल है:

  @PrePersist निजी शून्य उत्पन्न सिक्रेट () {this.setProjectSecret (UUID.randomUUID ()। ToString ()); }  

परियोजना इकाई वर्ग में। जब इस पद्धति को डाला जाता है (और @ जेनरिक जनरेटर & amp; @ जनरेटेड वैल्यू टैग हटाए गए हैं), तो परियोजना का रहस्य सही ढंग से उत्पन्न और डाला जाता है; प्रणाली अपेक्षा के अनुरूप काम करती है; कोई भी अपवाद नहीं फेंक दिया जाता है हालांकि, (मेरा मानना ​​है) यह विशिष्टता 2 सुनिश्चित नहीं कर सकता है और जब एक डुप्लिकेट गुप्त डाला जाता है तो बस अपवाद का कारण बनता है मैं विशिष्टता सुनिश्चित करना चाहता हूं और अधिनिर्मित हाइबरनेट जनरेटरों के साथ इसे हल करना चाहता हूं।

(नोट्स)

  1. वास्तव में मुझे यकीन नहीं है कि विशिष्टता को लागू किया जाना चाहिए। मुझे लगता है कि हर गुप्त अनूठा (सैद्धांतिक रूप से) सुरक्षा की एक अतिरिक्त परत बना सकता है, जो मुझे ले जाता है:
  2. मुझे पता है कि यूयूआईडी टकराव की संभावना बहुत कम है, इसलिए यूयूआईडी पीढ़ी यह सुनिश्चित करता है कि एक विशिष्टता संभाव्यता का अर्थ है, लेकिन क्या मैं वास्तव में इसकी पुष्टि कर सकता हूं?

मेरे पास था इस तरह एक मुद्दा पहले और मुझे कुछ समय बाद एहसास हुआ कि यह मेरी डेटाबेस तालिका थी जो इस मुद्दे को पैदा कर रहा था। यह आपके लिए ऐसी ही समस्या हो सकती है ...

अपने प्रोजेक्ट_आईड के लिए सुनिश्चित करें कि आप डेटाबेस में उस कॉलम को बनाते समय निम्न का उपयोग करें

  हमेशा की तरह तैयार हो गया  

मुझे आशा है कि यह वही मुद्दा है और यह आपके लिए मदद का होगा। इसके अलावा आपकी रणनीति के रूप में uuid2 का उपयोग करने की सलाह दी जाएगी।

यहां देखें ...

संपादित करें

यह महसूस करने के बाद कि project_secret नहीं है @id फ़ील्ड तो उत्तर यह है कि सीतनिद्रा में किसी भी कॉलम पर @id फ़ील्ड को छोड़कर तैयार किए गए मानों का समर्थन नहीं करता है अधिक विवरण के लिए यहां देखें:


Comments

Popular posts from this blog

sqlite3 - UPDATE a table from the SELECT of another one -

c# - Showing a SelectedItem's Property -

javascript - Render HTML after each iteration in loop -