2010-05-05 7 views
51

मैं एक जेपीए-मैप किया इकाई पर एक बहु कुंजी बाधा शुरू करने की कोशिश कर रहा हूँ:जेपीए एनोटेशन के साथ बहु-स्तंभ बाधा कैसे पेश करें?

public class InventoryItem { 
    @Id 
    private Long id; 

    @Version 
    private Long version; 

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

    @Column(nullable=false); 
    private long serial; 
} 
मूल रूप से

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

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

उत्तर

110

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

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

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

+0

बात की इस तरह पहले से ही जगह में बाधाओं के साथ एक मौजूदा डेटाबेस के लिए आवश्यक है की तरह होना चाहिए? – Rob

33

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

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

फिर @Table एनोटेशन निम्नलिखित

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

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