मैं इस समस्या पर एक अलग कोण से हमला करने का सुझाव दूंगा:
-
एक नया कॉलम जोड़ें, आंतरिक एक, इसे lcname कहें (लोअर-केसेड नाम के लिए खड़ा है)
@NotEmpty @Column(nullable = false) private String lcname;
-
इसके बजाय नए फ़ील्ड का उपयोग करने के लिए एनोटेशन के रूप में आपके द्वारा सेट की गई बाधा को बदलें:
@Entity @Table(uniqueConstraints={@UniqueConstraint(columnNames={"lcname"})}) public class Component extends Model { ... }
-
क्लाइंट द्वारा प्रदान किए गए मूल नाम के निचले मामले के साथ lcname भी सेट करने के लिए नाम सेटर को संशोधित करें
public void setName(String name) { this.name = name; this.lcname = name.toLowerCase(); }
यही बात है। हर बार जब इकाई बनी रहेगी, तो एक निचला केस नाम भी सहेजा जाएगा। इस तरह यदि आप "ए" को सहेजते हैं तो आपके पास एलसीनाम ="ए" सहेजा गया रिकॉर्ड होगा, और अगली बार जब आप "ए" नाम वाली इकाई को सहेजने का प्रयास करेंगे तो lcname पर बाधा के कारण ऑपरेशन विफल हो जाएगा परिवर्तन पूरी तरह से पारदर्शी है किसी भी व्यक्ति के लिए जो डेटाबेस से एक इकाई प्राप्त करता है क्योंकि lcname निजी है और इसके लिए कोई गेट्टर नहीं है, जबकि मूल getName मूल नाम वापस कर देगा जैसा कि इसे बनाने वाले क्लाइंट द्वारा शुरू में प्रदान किया गया था।