JPA एनोटेशन के साथ मल्टी-कॉलम बाधा कैसे शुरू करें?


91

मैं एक जेपीए-मैप्ड इकाई पर एक बहु-कुंजी बाधा को शुरू करने की कोशिश कर रहा हूं:

public class InventoryItem {
    @Id
    private Long id;

    @Version 
    private Long version;

    @ManyToOne
    @JoinColumn("productId")
    private Product product;

    @Column(nullable=false);
    private long serial;
}

मूल रूप से (उत्पाद, धारावाहिक) जोड़ी अद्वितीय होनी चाहिए, लेकिन मुझे केवल यह कहने का एक तरीका मिला कि धारावाहिक अद्वितीय होना चाहिए। यह स्पष्ट रूप से एक अच्छा विचार नहीं है क्योंकि विभिन्न उत्पादों में समान सीरियल नंबर हो सकते हैं।

क्या जेपीए के माध्यम से इस बाधा को उत्पन्न करने का एक तरीका है या क्या मैं इसे मैन्युअल रूप से डीबी बनाने के लिए मजबूर हूं?

जवाबों:


190

आप @Table(uniqueConstraints = ...)अपनी इकाई कक्षा में एनोटेशन का उपयोग करके अद्वितीय अवरोधों की घोषणा कर सकते हैं

@Entity
@Table(uniqueConstraints={
    @UniqueConstraint(columnNames = {"productId", "serial"})
}) 
public class InventoryItem {
    ...
}

ध्यान दें कि यह डेटाबेस में अद्वितीय रूप से बाधा नहीं बनाता है, फिर भी आपको इसे बनाने के लिए DDL की आवश्यकता है। लेकिन ऐसा लगता है कि आप जेपीए इकाई परिभाषाओं के आधार पर डेटाबेस बनाने के लिए किसी प्रकार के स्वचालित उपकरण का उपयोग कर रहे हैं।


1
क्या मौजूदा डेटाबेस के लिए इस तरह की चीज़ों की ज़रूरत पहले से ही है?
रोब

मुझे विश्वास है कि बाधा को बनाया जाएगा जेपीए प्रदाता डेटा बेस बना रहा है।
एलनऑब्जेक्ट

विशिष्टता (productId) कॉलम और (धारावाहिक) कॉलम के लिए या कुल में 2 कॉलम की बाधा (productId, serial) के लिए है?
पी सतीश पात्रो

69

जैसा कि पहले ही उत्तर दिया गया है, @Tableएनोटेशन का उपयोग करके मल्टी-कॉलम इंडेक्स जोड़ा जा सकता है । हालांकि, columnNamesवास्तविक डीबी कॉलम का नाम होना चाहिए, न कि वर्गीय विशेषता। तो, यदि स्तंभ निम्नलिखित की तरह है:

@Column(name="product_id")
Long productId;

फिर @Tableएनोटेशन निम्नलिखित की तरह होना चाहिए

@Table(uniqueConstraints=
       @UniqueConstraint(columnNames = {"product_id", "serial"}) 

10
यह एक बहुत महत्वपूर्ण स्पष्टीकरण है: तालिका के नाम और वस्तु के नाम नहीं।
कैलाबासिन

1
विशिष्टता (productId) कॉलम और (धारावाहिक) कॉलम के लिए या कुल में 2 कॉलम की बाधा (productId, serial) के लिए है?
पी सतीश पात्रो

कोटलिन: कोटलिन के लिए एक उदाहरण खोजने के लिए इस उत्तर पर एक नज़र डालें: stackoverflow.com/a/47000044/285431
डिर्क

वक्य रचना त्रुटि। आपको @Table एनोटेशन पर बंद कोष्ठक याद आ रहे हैं।
Evvo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.