2009-05-07 11 views
9

मेरे पास एक विरासत स्कीमा है जिसे बदला नहीं जा सकता है। मैं सामान्य सुविधाओं के लिए बेस क्लास का उपयोग कर रहा हूं और इसमें एक एम्बेडेड ऑब्जेक्ट है। एक ऐसा क्षेत्र है जो आम तौर पर एम्बेडेड ऑब्जेक्ट में मैप किया जाता है जिसे केवल एक (कई) उप-वर्गों के लिए दृढ़ता आईडी में होना आवश्यक है। मैंने एक नई आईडी क्लास बनाई है जिसमें इसे शामिल किया गया है लेकिन फिर मुझे त्रुटि मिलती है कि फ़ील्ड को दो बार मैप किया गया है। यहाँ कुछ उदाहरण कोड है कि ज्यादा पाठक के विवेक बनाए रखने के लिए सरल है है:जेपीए में एक सुपरक्लस क्षणिक से विरासत में मैप किए गए क्षेत्र को कैसे बनाया जाए?

@MappedSuperclass 
class BaseClass { 
    @Embedded 
    private Data data; 
} 

@Entity 
class SubClass extends BaseClass { 
    @EmbeddedId 
    private SubClassId id; 
} 

@Embeddable 
class Data { 
    private int location; 

    private String name; 
} 

@Embeddable 
class SubClassId { 
    private int thingy; 

    private int location; 
} 

मैं @AttributeOverride की कोशिश की है, लेकिन मैं केवल यह क्षेत्र का नाम बदलने का मिल सकता है। मैंने इसे अद्यतन करने योग्य = झूठी, डालने योग्य = झूठी पर सेट करने का प्रयास किया है, लेकिन यह @AttributeOverride एनोटेशन में उपयोग किए जाने पर काम नहीं कर रहा था। इस मुद्दे के समाधान के लिए नीचे उत्तर देखें।

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

मैं अपने जेपीए प्रदाता के रूप में हाइबरनेट का उपयोग कर रहा हूं।

उत्तर

5

मुझे कारण मिला है AttributeOverride काम नहीं कर रहा था। कक्षा को एनोटेट करते समय आपको नाम फ़ील्ड में एम्बेडेड ऑब्जेक्ट के पहचानकर्ता को शामिल करना होगा। मैं यह कर रहा था:

@Entity 
@AttributeOverride(name = "location", column = @Column(name = "location", insertable = false, updatable = false) 
class SubClass extends BaseClass { 

जब यह इस होने की जरूरत:

@Entity 
@AttributeOverride(name = "data.location", column = @Column(name = "location", insertable = false, updatable = false) 
class SubClass extends BaseClass { 

अजीब बात है कि @ स्तंभ का नाम क्षेत्र बदलते किया पहला संस्करण लेकिन insertable और updatable क्षेत्रों के साथ काम नजरअंदाज कर दिया गया । मुझे नहीं पता कि यह जेपीए स्पेक का एक बग या सूक्ष्मता है या नहीं।

वैसे भी, यह हल करता है कि फ़ील्ड को केवल पढ़ने के लिए कैसे करें, लेकिन यह मूल प्रश्न का उत्तर नहीं देता है: क्या मैप किए गए सुपरक्लास ट्रांजिएंट से फ़ील्ड बनाना संभव है?

+0

मुझे पता है कि यह अब 6 साल का है, लेकिन क्या आपको कभी इस प्रश्न का समाधान मिला? और/या याद रखें कि यह क्या था? –

+0

@EricB। क्षमा करें, मैप किए गए क्षेत्र का वारिस नहीं करने का कोई तरीका नहीं मिला। मुझे नहीं लगता कि यह करना संभव है। मुझे लगता है कि वे इसे जावा में विरासत विधि की दृश्यता को कम करने की कोशिश कर सकते हैं - इसलिए नियमों के खिलाफ। मेरे मामले में मैंने कोने के मामले में गोल किया जो थोड़ा बदसूरत है लेकिन एकमात्र विकल्प था। –

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