2009-06-03 8 views
20

मेरे पास एक इकाई वर्ग के दो क्षेत्र हैं जो मैं अद्वितीय नहीं होना चाहता हूं बल्कि इसके बजाय एक कुंजी के लिए समग्र फ़ील्ड के रूप में उपयोग किया जाना चाहिए जो स्वयं अद्वितीय होना चाहिए। उदाहरण के लिए मेरे पास दो फ़ील्ड (नाम और संस्करण) हैं जो अन्य रिकॉर्ड के लिए समान हो सकते हैं लेकिन एक साथ वे अद्वितीय होना चाहिए। हाइबरनेट (एनोटेशन के साथ) का उपयोग करके ऐसा करने का सबसे अच्छा तरीका क्या है? मैं अन्य क्षेत्रों के लिए हाइबरनेट वैलिडेटर का उपयोग कर रहा हूं, लेकिन मुझे यह सुनिश्चित करने का कोई तरीका नहीं है कि उन दोनों फ़ील्ड को एक साथ अनूठी कुंजी लिखने के लिए मान्य किया जाए। मैं एक सामान्य इकाई वर्ग का उपयोग कर रहा हूं जिसमें एक आईडी जेनेरिक प्रकार है जिसे एक समग्र कुंजी वर्ग के लिए बदला जा सकता है लेकिन मुझे अभी तक बहुत अच्छी तरह से काम करने के लिए यह नहीं मिला है।हाइबरनेट के साथ दो क्षेत्रों के लिए एक अनूठी कुंजी कैसे प्राप्त करें?

@Table(name = "MYTABLE", 
     uniqueConstraints = { @UniqueConstraint(columnNames = { "NAME", "VERSION" }) }) 

यह एक अद्यतन पर डेटाबेस से लागू किया जाएगा या जारी रहती है:

+0

क्या आप दो कॉलम पर "अनन्य बाधा" चाहते हैं, या तालिका पर "प्राथमिक कुंजी" जिसमें दो कॉलम होते हैं? –

+0

मुझे दो कॉलम पर एक अनूठी बाधा चाहिए। उदाहरण के लिए नाम और संस्करण का संयोजन अद्वितीय होना चाहिए। इसलिए मेरे पास रिकॉर्ड # 1 (नाम = एबीसी/संस्करण = 1) के साथ तालिका में दो रिकॉर्ड हो सकते हैं और रिकॉर्ड # 2 (नाम = एबीसी/संस्करण = 2) के साथ, लेकिन रिकॉर्ड # 1 (नाम के साथ तालिका में दो रिकॉर्ड नहीं हैं = एबीसी/संस्करण = 1) और रिकॉर्ड # 2 (नाम = एबीसी/संस्करण = 1) के साथ। –

उत्तर

37

इस डेटाबेस पर एक अद्वितीय कुंजी पैदा करेगा।

यदि आप हाइबरनेट वैलिडेटर का उपयोग करके इसे लागू करना चाहते हैं तो आपको अपना खुद का कस्टम सत्यापनकर्ता लिखना होगा।

+0

और पीके के रूप में इकाई में क्या लिखा जाना चाहिए? ... यदि पीके नाम और संस्करण –

+1

@ yoav.str - यदि पीके नाम और संस्करण है तो आपको इसके बजाय @ आईडी/@ के साथ एक समग्र प्राथमिक कुंजी का उपयोग करना चाहिए आईडीक्लास या @ एंबेडेड आईडी/@ एम्बेड करने योग्य – mtpettyp

+0

यह हाइबरनेट 3.6.3 का उपयोग करके मेरे लिए काम किया। फाइनल। धन्यवाद! – Jorge

4

हम आम तौर पर दो फ़ील्ड को एक आंतरिक कुंजी वर्ग में लपेटेंगे जिसे @Embeddable के रूप में चिह्नित किया गया है। उदाहरण के लिए:

@Entity 
public class Foo { 

    @EmbeddedId() 
    private Key key; 
    ... 

    @Embeddable 
    public static class Key { 
    @Column(nullable=false) 
    private String name; 
    @Column(nullable=false) 
    private int version; 

    protected Key() { 
     // for hibernate 
    } 
    public Key (String name, int version) { 
     this.name = name; 
     this.version = version; 
    } 
    ... 
    // You probably want .equals and .hashcode methods 
    } 
} 
संबंधित मुद्दे