मेरे पास एक विरासत स्कीमा है जिसे बदला नहीं जा सकता है। मैं सामान्य सुविधाओं के लिए बेस क्लास का उपयोग कर रहा हूं और इसमें एक एम्बेडेड ऑब्जेक्ट है। एक ऐसा क्षेत्र है जो आम तौर पर एम्बेडेड ऑब्जेक्ट में मैप किया जाता है जिसे केवल एक (कई) उप-वर्गों के लिए दृढ़ता आईडी में होना आवश्यक है। मैंने एक नई आईडी क्लास बनाई है जिसमें इसे शामिल किया गया है लेकिन फिर मुझे त्रुटि मिलती है कि फ़ील्ड को दो बार मैप किया गया है। यहाँ कुछ उदाहरण कोड है कि ज्यादा पाठक के विवेक बनाए रखने के लिए सरल है है:जेपीए में एक सुपरक्लस क्षणिक से विरासत में मैप किए गए क्षेत्र को कैसे बनाया जाए?
@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 एनोटेशन में उपयोग किए जाने पर काम नहीं कर रहा था।
इस मुद्दे के समाधान के लिए नीचे उत्तर देखें।
मुझे एहसास है कि मैं बेस क्लास बदल सकता हूं लेकिन मैं वास्तव में साझा फ़ील्ड को अलग करने के लिए एम्बेडेड ऑब्जेक्ट को विभाजित नहीं करना चाहता क्योंकि यह आसपास के कोड को अधिक जटिल बना देगा और कुछ बदसूरत रैपिंग कोड की आवश्यकता होगी। मैं इस कोने के मामले के लिए पूरी प्रणाली को फिर से डिजाइन कर सकता हूं लेकिन मैं वास्तव में नहीं बल्कि करूंगा।
मैं अपने जेपीए प्रदाता के रूप में हाइबरनेट का उपयोग कर रहा हूं।
मुझे पता है कि यह अब 6 साल का है, लेकिन क्या आपको कभी इस प्रश्न का समाधान मिला? और/या याद रखें कि यह क्या था? –
@EricB। क्षमा करें, मैप किए गए क्षेत्र का वारिस नहीं करने का कोई तरीका नहीं मिला। मुझे नहीं लगता कि यह करना संभव है। मुझे लगता है कि वे इसे जावा में विरासत विधि की दृश्यता को कम करने की कोशिश कर सकते हैं - इसलिए नियमों के खिलाफ। मेरे मामले में मैंने कोने के मामले में गोल किया जो थोड़ा बदसूरत है लेकिन एकमात्र विकल्प था। –