मैं जावा के लिए ओआरएम ढांचे में से किसी एक का उपयोग कर एक संबंधपरक डेटाबेस में एक डोमेन मॉडल को मैप करना चाहता हूं। दुर्भाग्य से, उनमें से कोई भी कई इंटरफेस को लागू करने वाले वर्गों के लिए पर्याप्त समर्थन नहीं प्रतीत होता है। मैं की तरह कुछ मैप करना चाहते हैं कहते हैं:जावा ओआरएम: एकाधिक (इंटरफ़ेस) विरासत
public interface Quotable {
}
public interface Tradable {
}
// StockIndex only implements Quotable as it cannot be trade directly
public class StockIndex implements Quotable {
}
// Stock implements both interfaces as there are market quotes and can be traded
public class Stock implements Quotable, Tradable {
}
public class Quote {
private Quotable quotable;
}
public class Trade {
private Tradable tradable;
}
तो क्या मैं प्राप्त करने के लिए कोशिश कर रहा हूँ एक उद्धरण किसी भी हवाला देने योग्य (स्टॉक, StockIndex और अन्य) संदर्भित कर सकते हैं कि जब एक व्यापार केवल व्यापार योग्य संस्थाओं को संदर्भित कर सकते है। मैंने ओपनजेपीए और (सादा) हाइबरनेट को कोई भाग्य नहीं दिया है, भले ही इंटरफेस के बाद के समर्थन का वादा किया गया हो।
क्या कोई ढांचा है जो मेरे परिदृश्य को संभाल सकता है? या क्या कोई अच्छा कारण है कि इसे डेटाबेस में मैप नहीं किया जाना चाहिए? यदि हां, तो मेरे मॉडल को कैसे संशोधित किया जाना चाहिए?
<hibernate-mapping package="com.foo">
<class name="Quotable" table="quotable" >
<id type="java.lang.Long" column="id">
<generator class="sequence" />
</id>
<discriminator column="type" type="string" />
<subclass name="StockIndex">
<join table="stock_index" >
<key column="id"/>
<property name="name" column="name" access="field" />
</join>
</subclass>
<subclass name="Stock">
<join table="stock" >
<key column="id"/>
<property name="name" column="name" access="field" />
</join>
</subclass>
</class>
</hibernate-mapping>
यह वह जगह है:
मेरे प्रारंभिक हाइबरनेट मानचित्रण कुछ इस तरह (मैं किसी भी OpenJPA सामान यह इंटरफ़ेस विरासत या कम से कम मैं कैसे समझ नहीं सकता का समर्थन नहीं करता के रूप में नहीं दिखाया जा रहा हूँ) देखा काफी Hibernate documentation और एक मेज उद्धरण योग्य एक आईडी और एक स्ट्रिंग discriminator स्तंभ, एक मेज एक आईडी और सूचकांक 'नाम और एक आईडी और के साथ एक मेज शेयर साथ stock_index साथ में परिणामों में उदाहरण के समान स्टॉक का नाम अब तक बहुत अच्छा ...
लेकिन ट्रेडमार्क इंटरफ़ेस के साथ मैं क्या करूँ? मुझे दोनों पदानुक्रमों में एक अलग पदानुक्रम और नक्शा स्टॉक सेट करना होगा। मैंने कोशिश की लेकिन स्टॉक के लिए अलग-अलग इकाई नामों को परिभाषित करना पड़ा (और this patch को शामिल करने की आवश्यकता थी) लेकिन यह विदेशी कुंजी उल्लंघनों के कारण भी काम नहीं करता था। मैंने कुछ अन्य अस्पष्ट चीजों की कोशिश की जो काम नहीं करते थे।
वैसे भी, स्टॉक दो बार मैपिंग एक अच्छा समाधान नहीं होगा क्योंकि एप्लिकेशन को प्रत्येक इंटरफ़ेस के लिए दो बार स्टॉक इंस्टेंस जोड़ना याद रखना होगा। मैं ढांचे को इस automaticaly संभाल लेंगे।
आदर्श रूप में हाइबरनेट (उपवर्ग तत्व पर ध्यान दें फैली विशेषता) अर्थात कुछ जैसे कई इंटरफेस का विस्तार, की अनुमति होगी:
<subclass name="Stock" extends="Quotable, Tradable" >
<join table="stock" >
<key column="id"/>
<property name="name" column="name" access="field" />
</join>
</subclass>
किसी भी अन्य विचारों कि मेरे उदाहरण मैप किया जा सकता? अब मैंने <any>
तत्व के बारे में सीखा है जो ऐसा लगता है कि यह मेरे लिए काम कर सकता है लेकिन मुझे अभी तक इसके सभी प्रभावों को समझना नहीं है।
अन्य ढांचे के बारे में कैसे? मैंने सुना है कि एक्लिप्ससेंक को इंटरफ़ेस के लिए कुछ समर्थन भी है लेकिन यह अच्छी तरह से प्रलेखित नहीं है।
आपने वास्तव में समझाया नहीं है कि क्या काम नहीं करता है, या आप मैपिंग कैसे कर रहे हैं। –
मैंने अब अपनी हाइबरनेट मैपिंग को कुछ और विस्तार से शामिल किया है जो मैंने कोशिश की थी। उम्मीद है कि यह अब और स्पष्ट हो जाएगा। – kaiboy