2012-04-17 18 views
14

क्या ऑर्मेलाइट इस तीन विरासत-रणनीतियों का समर्थन करता है? वर्ग पदानुक्रम प्रतिक्या ऑर्मेलाइट समर्थन विरासत है?

  • तालिका
  • ठोस वर्ग प्रति उपवर्ग तालिका
  • तालिका

मैं this discussion on the ORMLite user group पाया है, लेकिन मुझे यकीन है कि यह मेरे सवाल का जवाब नहीं कर रहा हूँ।

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

उत्तर

9

ORMLite इन्हें स्वचालित रूप से समर्थन नहीं करता है, नहीं।

क्या मैं जरूरत है: अगर मैं एक सुपर क्लास के रूप में वर्ग एक है, और मुझे प्रत्यक्ष उपवर्गों बी और सी है मुझे यकीन है कि आप वास्तव में धागा आप क्योंकि यह इसके बारे में काफी विशिष्ट है से जुड़ा हुआ पढ़ नहीं कर रहा हूँ , और मैं कक्षा ए के सभी रिकॉर्ड्स/ऑब्जेक्ट्स के लिए एक क्वेरी चलाता हूं, मैं कक्षा ए, बी और सी के सभी ऑब्जेक्ट्स लौटाना चाहता हूं।

हाँ, ORMLite ऐसा नहीं करता है और वर्तमान में मेरे पास इसका समर्थन करने की कोई योजना नहीं है। इसकी जटिलता, जब तक कि मैं इसे पूरा करने के तरीके पर गलत नहीं हूं, मैं जो कहूं वह "लाइट" था। जिस तरह से हाइबरनेट इस तरह के संरचनाओं का समर्थन करता है, वह विदेशी कुंजी, एकाधिक तालिकाओं और जादू में शामिल होता है। - तो यह सार नहीं किया जा सकता

1) आप वर्ग एक और एक संबद्ध तालिका हो सकता है:

कि सवाल यह है कि ORMLite उपयोग करने के लिए विरासत को लागू करने के बारे में कुछ विचारों देता है। फिर आपके पास बी और सी हो सकता है जो उप-वर्ग ए हो और सभी फ़ील्ड को एक अलग तालिका में रखें। इसके बाद आप ए के लिए एक विशेष डीएओ बना सकते हैं जो बी और सी के लिए भी पूछताछ करेगा और उन्हें ए

2) ऐसा करने का एक और तरीका यह है कि आप कक्षा बी और सी उप-वर्ग बन सकते हैं लेकिन इसके बजाय ए के लिए एक विदेशी वस्तु है। फिर आप सभी के रूप में पूछ सकते हैं और उनमें से कुछ बी के ए भाग और कुछ सी के ए भाग और कुछ सिर्फ ए होंगे। फिर आप बीएस और सीएस से पूछ सकते हैं और ए डीएओ का उपयोग कर सकते हैं रीफ्रेश करें और ए के फ़ील्ड प्राप्त करें जिन्हें आप कास्ट नहीं कर पाएंगे। ए में कुछ प्रकार का enum भी हो सकता है, जिसमें कहा गया था कि यह ए, बी, या सी था। आप कुछ जादू भी कर सकते हैं जहां आप getSubClassObject() कह सकते हैं, अगर enum को देखें और बी या सी दाओ से पूछें एक वस्तु के लिए सही विदेशी कुंजी के साथ संबंधित वस्तु।

+0

क्षमा करें, शायद मैं लिंक के बारे में पर्याप्त स्पष्ट नहीं था। मैंने सोचा कि शायद अब उनके लिए एक कार्यान्वित समाधान है, क्योंकि यह पद जनवरी 2011 से है, लेकिन आपके उत्तर – Flow

+0

एनपी @ फ्लो के लिए धन्यवाद। यह उस सुविधा के लिए एक और वोट है। यदि आप इसे ORMLite में जोड़ने में सहायता करना चाहते हैं, तो मेलिंग सूचियों पर कुछ ईमेल भेजें। – Gray

+0

इसे वापस लाने के लिए खेद है, लेकिन इसका मतलब यह है कि यदि कक्षा बी कक्षा ए को बढ़ाता है, तो आपके पास दो अलग-अलग टेबल नहीं हो सकते हैं, जहां कक्षा बी कक्षा ए गुणों का उपयोग तालिका बी कॉलम के रूप में करता है? – Maxrunner

32

ORMlite विरासत का समर्थन करता है लेकिन यह विरासत-स्ट्रैटजीज का समर्थन नहीं करता है।

ORMLite के साथ विरासत का एक उदाहरण निम्नलिखित है।

एक सार सुपर क्लास नहीं एक ORMLite डेटाबेस तालिका thats बनायें लेकिन सभी उपवर्गों

public abstract class Event { 

    @DatabaseField(columnName="id", generatedId = true) 
    protected int _id; 

    @DatabaseField(columnName="name") 
    protected String name; 

    @DatabaseField(columnName="date") 
    protected Date date; 

    @DatabaseField(columnName="type") 
    protected String type; 

    public abstract void setName(String name); 
    public abstract void setDate(Date date); 
    public abstract void setType(String type); 
} 

2) एक वर्ग है कि यह विरासत में बना सकते हैं और कुछ क्षेत्रों को जोड़ने (thats एक डेटाबेस तालिका) द्वारा इस्तेमाल किया कुछ डेटाबेस फ़ील्ड है

@DatabaseTable(tableName="atividade") 
public class Atividade extends Event { 

     @DatabaseField(columnName="ala") 
     protected String ala; 

     public String getAla() { 
       return ala; 
     } 

     public void setAla(String ala) { 
       this.ala = ala; 
     } 

     public Atividade(String name, Date date, String type, String ala) { 
       this.setName(name); 
       this.setDate(date); 
       this.setTipo(type); 
       this.setAla(ala); 
     } 

     Atividade(){ 
     } 

     @Override 
     public void setName(String name) { 
       this.name = name; 
     } 

     @Override 
     public void setDate(Date date) { 
       this.date = date; 
     } 

     @Override 
     public void setType(String type) { 
       this.type = type; 
     } 
} 

आशा है कि मदद करता है!

+2

इस उत्तर को जोड़ने के लिए बहुत बहुत धन्यवाद! यह वही है जो मैं करना चाहता था। – theblang

+1

यदि आपके पास इवेंट का विस्तार करने वाली एक और कक्षा है, तो उदाहरण कहें। आप Atividade और उदाहरण दोनों के लिए कैसे पूछताछ करते हैं? – Bri6ko

+0

@ Bri6ko: इस मुद्दे को नए प्रश्न के रूप में लिखें और इसे यहां देखें –

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