2012-04-01 16 views
6

मैं जावा के लिए ओआरएम ढांचे में से किसी एक का उपयोग कर एक संबंधपरक डेटाबेस में एक डोमेन मॉडल को मैप करना चाहता हूं। दुर्भाग्य से, उनमें से कोई भी कई इंटरफेस को लागू करने वाले वर्गों के लिए पर्याप्त समर्थन नहीं प्रतीत होता है। मैं की तरह कुछ मैप करना चाहते हैं कहते हैं:जावा ओआरएम: एकाधिक (इंटरफ़ेस) विरासत

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> तत्व के बारे में सीखा है जो ऐसा लगता है कि यह मेरे लिए काम कर सकता है लेकिन मुझे अभी तक इसके सभी प्रभावों को समझना नहीं है।

अन्य ढांचे के बारे में कैसे? मैंने सुना है कि एक्लिप्ससेंक को इंटरफ़ेस के लिए कुछ समर्थन भी है लेकिन यह अच्छी तरह से प्रलेखित नहीं है।

+5

आपने वास्तव में समझाया नहीं है कि क्या काम नहीं करता है, या आप मैपिंग कैसे कर रहे हैं। –

+0

मैंने अब अपनी हाइबरनेट मैपिंग को कुछ और विस्तार से शामिल किया है जो मैंने कोशिश की थी। उम्मीद है कि यह अब और स्पष्ट हो जाएगा। – kaiboy

उत्तर

3

मुझे नहीं लगता कि आपको इंटरफेस पदानुक्रम को अच्छी तरह से संभालने में सक्षम कोई भी ओआरएम मिलेगा। तो मैं यहां ओआरएम के बारे में बात नहीं करूंगा लेकिन मैं आपको यह दिखाने के लिए जा रहा हूं कि Qi4j का उपयोग करके अपना उदाहरण कैसे कार्यान्वित किया जाए।

क्यूआई 4j मानक जावा प्लेटफ़ॉर्म का उपयोग करके समग्र ओरिएंटेड प्रोग्रामिंग का कार्यान्वयन है और डोमेन केंद्रित अनुप्रयोग विकास के लिए एक ढांचा है, जिसमें एओपी, डीआई और डीडीडी से विकसित अवधारणाएं शामिल हैं। http://qi4j.org

Qi4j में, डोमेन स्थिति को इकाइयों और मानों का उपयोग करके मॉडलिंग किया गया है। निम्नलिखित कोड नमूने में मुझे लगता है कि सबकुछ एक इकाई है लेकिन आपका माइलेज भिन्न हो सकता है।

चूंकि संस्थाओं को केवल इंटरफेस का उपयोग करके घोषित किया जाता है, इसलिए आपका उपयोग केस अच्छी तरह से फिट होना चाहिए।

interface Quotable { ... } 
interface Tradable { ... } 
interface StockIndex extends Quotable { ... } 
interface Stock extends Quotable, Tradable { ... } 
interface Quote { 
    Association<Quotable> quotable(); 
} 
interface Trade { 
    Association<Tradable> tradable(); 
} 

आप कर सकते हैं एक EntityStore में तो दुकान शोध करे और उन्हें आसानी से पुनः प्राप्त करने के क्वेरी API का उपयोग करें (और एक पूरी तरह बहुरूपी तरीके से)।

ध्यान दें कि Qi4j EntityStores केवल SQL आधारित नहीं हैं बल्कि NoSQL डेटाबेस का भी समर्थन करते हैं। यहां उपलब्ध एक्सटेंशन देखें: http://qi4j.org/latest/extensions.html

यदि आपके कोई और प्रश्न हैं तो Qi4j दस्तावेज़ देखें।

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