2012-11-02 38 views
14

मैं अपने आवेदन में जेपीए का उपयोग कर रहा हूं। तालिका में से एक में, मैंने प्राथमिक कुंजी का उपयोग नहीं किया है (मुझे यह एक खराब डिजाइन पता है)।जेपीए त्रुटि: इकाई में कोई प्राथमिक कुंजी विशेषता परिभाषित नहीं है

@Entity 
@Table(name="INTI_SCHEME_TOKEN") 
public class IntiSchemeToken implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Column(name="CREATED_BY") 
    private String createdBy; 

    @Temporal(TemporalType.DATE) 
    @Column(name="CREATED_ON") 
    private Date createdOn; 

    @Column(name="SCH_ID") 
    private BigDecimal schId; 

    @Column(name="TOKEN_ID") 
    private BigDecimal tokenId; 

    public IntiSchemeToken() { 
    } 

    public String getCreatedBy() { 
     return this.createdBy; 
    } 

    public void setCreatedBy(String createdBy) { 
     this.createdBy = createdBy; 
    } 

    public Date getCreatedOn() { 
     return this.createdOn; 
    } 

    public void setCreatedOn(Date createdOn) { 
     this.createdOn = createdOn; 
    } 

    public BigDecimal getSchId() { 
     return this.schId; 
    } 

    public void setSchId(BigDecimal schId) { 
     this.schId = schId; 
    } 

    public BigDecimal getTokenId() { 
     return this.tokenId; 
    } 

    public void setTokenId(BigDecimal tokenId) { 
     this.tokenId = tokenId; 
    } 



} 

यहाँ मेरी परियोजना में, ग्रहण आईडीई त्रुटि चिह्न (रेड क्रॉस रंग) इस वर्ग पर पता चलता है और त्रुटि है "इकाई कोई प्राथमिक कुंजी है:

अब उत्पन्न इकाई नीचे उल्लेख किया है के रूप में विशेषता परिभाषित "।

क्या कोई मुझे बता सकता है, प्राथमिक कुंजी के बिना इकाई कैसे बनाएं?

धन्यवाद।

+0

http://stackoverflow.com/questions/1519078/oracle-legacy-table-without-good-pk-how-to-hibernate – gavenkoa

उत्तर

18

आप नहीं कर सकते। एक इकाई के पास एक अद्वितीय, अपरिवर्तनीय आईडी होना चाहिए। इसे डेटाबेस में प्राथमिक कुंजी के रूप में परिभाषित करने की आवश्यकता नहीं है, लेकिन फ़ील्ड या फ़ील्ड के सेट को विशिष्ट रूप से पंक्ति की पहचान करनी होगी, और इसका मान बदल नहीं सकता है।

तो, यदि आपकी इकाई में एक फ़ील्ड, या आपकी इकाई में फ़ील्ड का एक सेट, इन मानदंडों को पूरा करता है, तो उसे (या उन्हें) इकाई की आईडी बनाएं। उदाहरण के लिए, यदि कोई तरीका नहीं है कि कोई उपयोगकर्ता उसी दिन दो उदाहरण बना सकता है, तो आप इकाई के आईडी [बनाया गया, बनाया गया] बना सकते हैं।

बेशक यह एक खराब समाधान है, और आपको वास्तव में अपनी स्कीमा बदलनी चाहिए और इकाई में स्वत: जेनरेटेड, सिंगल-कॉलम आईडी जोड़नी चाहिए।

+3

+1। यदि आपको व्यवसाय तर्क बिंदु से इसकी आवश्यकता नहीं है, तो ओआरएम को खुश करने और आपके जीवन को आसान बनाने के लिए बस कृत्रिम आईडी कॉलम जोड़ें। –

+0

@ उत्तर के लिए धन्यवाद। मैंने डीबी में नहीं इकाई में प्राथमिक कुंजी के रूप में बनाया है घोषित किया है। यह अभी ठीक काम करता है। –

+0

"इसे डेटाबेस में प्राथमिक कुंजी के रूप में परिभाषित करने की आवश्यकता नहीं है"। मैं उस पर ऑब्जेक्ट करता हूं। यदि यह किसी अन्य प्राथमिक कुंजी परिभाषा के अस्तित्व के कारण जरूरी है, तो इसका उपयोग किया जाना चाहिए। अन्यथा, यदि अंतर्निहित सुझाव द्वितीयक अनुक्रमणिका को परिभाषित करना है, तो ठीक है, लेकिन बिना किसी इंडेक्स के जा रहे हैं, तो आप अपना डेटाबेस मार देंगे। –

6

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

1

http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#No_Primary_Key के अलावा आप Oracle में ROWID जैसे कुछ निर्माण के कॉलम का उपयोग कर सकते हैं:

लेकिन देखभाल के साथ:

इकाई ढांचे सभी प्रकार के डेटा (जैसे सांख्यिकीय डेटा जो विश्लेषण के लिए इस्तेमाल नहीं किया गया था) के लिए काम नहीं करता है। आप तालिका पर पी की जरूरत नहीं है - -

0

हाइबरनेट

बिना एक अन्य समाधान

अगर वहाँ स्तंभों की एक तार्किक संयोजन (यदि आप rowid किसी तरह का उपयोग कर सकते हैं आवश्यक नहीं) है कि पी हो सकता है है - लेकिन कुछ कॉलम पूर्ण हैं इसलिए आप वास्तव में डीबी सीमा की वजह से पीके नहीं बना सकते हैं - और आप तालिका संरचना को संशोधित नहीं कर सकते हैं (लीगेसी कोड पर कोई स्पष्ट रूप से सूचीबद्ध कॉलम के साथ सम्मिलित/चयन कथन तोड़ेंगे)

तो आप निम्न चाल का प्रयास कर सकते हैं - डेटाबेस पर दृश्य बनाएं वर्चुअल कॉलम जिसमें समेकित लॉजिकल कुंजी कॉलम का मूल्य है ('ए =' || ए || 'बी =' || 'सी =' सी ..) या पंक्ति - इस दृश्य द्वारा अपनी जेपीए इकाई वर्ग बनाएं - वर्चुअल कॉलम को @Id एनोटेशन

के साथ वर्चुअल कॉलम चिह्नित करें। डेटा ऑपरेशंस को अपडेट/डिलीट करना भी संभव है (सम्मिलित नहीं) लेकिन यदि वर्चुअल कुंजी कॉलम पंक्तिबद्ध नहीं है (डीबी टेबल द्वारा पूर्ण स्कैन खोजों से बचने के लिए)

पीएस एक ही विचार आंशिक रूप से जुड़े प्रश्न पर वर्णित है।

7

यदि आपकी प्राथमिक कुंजी (पीके) एक प्रबंधित सुपर क्लास है जो एक इकाई वर्ग में विरासत में प्राप्त होती है तो आपको persistence.xml फ़ाइल में मैप किए गए सुपर क्लास नाम को शामिल करना होगा। बग रिपोर्ट पर

देखो: https://bugs.eclipse.org/bugs/show_bug.cgi?id=361042

3

आप (बदलें) मान्यता है कि जोड़ा गया है बंद कर सकते हैं।

वर्कस्पेस वरीयताओं 'जावा पर्सिस्टेंस-> जेपीए-> त्रुटियों/चेतावनियों' के अगले 'टाइप' पर जाएं और 'चेतावनी' को 'चेतावनी' में 'प्राथमिकता की कोई प्राथमिक कुंजी' नहीं है।

0

आपको प्राथमिक कुंजी बनाने की आवश्यकता है, यदि कोई योग्य फ़ील्ड नहीं मिला है तो ऑटो वृद्धि आईडी बनाएं।

CREATE TABLE fin_home_loan (
    ID int NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (ID)); 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^