2010-11-18 13 views
5

मैं उस ऑब्जेक्ट को जारी रखने के बारे में कैसे जाउंगा जिसमें java.util.Properties ऑब्जेक्ट है?हाइबरनेट के साथ java.util.Properties persist?

ध्यान दें कि एक java.util.Properties वस्तु गुण देखने के लिए न केवल अपने आप में, लेकिन यह भी एक डिफ़ॉल्ट गुण सूची में क्षमता है। डिफ़ॉल्ट गुण सूची स्वयं Properties ऑब्जेक्ट है, इसलिए इसमें भी एक और डिफ़ॉल्ट गुण सूची हो सकती है। संपत्ति मिलने से पहले एक एकल संपत्ति को देखकर Properties ऑब्जेक्ट्स को पार कर सकता है।

जिस एप्लिकेशन को मैं निर्माण कर रहा हूं उसे Properties जैसे पदानुक्रमित तरीके से ओवरराइड-सक्षम गुणों की आवश्यकता है, इसलिए मैं अपनी खुद की डेटा संरचना को लागू करने के बजाय Properties का उपयोग करने की सोच रहा था। लेकिन मैं उलझन में हूं कि मैं उन्हें कैसे जारी रखूंगा।

  • क्या मुझे कस्टम उपयोगकर्ता टाइप बनाना होगा? इस स्थिति के लिए यह कैसे करें इस पर कोई संकेतक?
  • किसी को भी कैसे पता या अन्य संसाधन के बारे में पता है जो दर्शाता है कि हाइबरनेट में गुणों को कैसे बनाए रखना है?

उत्तर

3

पहला प्रश्न है - क्या आपको पदानुक्रम मेटाडेटा को स्टोर करने की आवश्यकता है, या आप बस सभी गुणों को स्टोर करना चाहते हैं। यदि यह पत्र बात है, तो बस एक Map समाप्त करने के लिए सभी गुण (getPropertyNames() उपयोग करते हुए) को जोड़ने यह जारी रहती है (नक्शे बने लगभग तुच्छ है)

आप पदानुक्रम बनाए रखने के लिए चाहते हैं, तो एक सवाल पूछने की है - कैसे करना चाहिए यह डेटाबेस में प्रतिनिधित्व किया जाना चाहिए। - मैं तुरंत नहीं सोच सकते हैं

id | key | value | properties_set_id | parent_properties_set_id 

लेकिन यह कैसे ऐसा करने के लिए:

सबसे आसान तरीका मैं कल्पना निम्नलिखित कॉलम के साथ एक मेज है। शायद Set<PropertyEntry> जारी रखें।

+0

Bozho, मुझे लगता है कि आप गुण उदाहरण क्षणिक बना देंगे, लेकिन फिर आप किस बिंदु पर गुणों को मानचित्र पर निर्यात करते हैं? मुझे यह सुनिश्चित करने के लिए मैकेनिक्स के बारे में निश्चित नहीं है। –

+0

@ जेसन निकोलस का मतलब यह एक मैन्युअल प्रक्रिया के रूप में था। या शायद एक '@ प्रीएक्स' घटना श्रोता। शायद उपयोगकर्ता टाइप के माध्यम से यह संभव है, लेकिन मैंने कभी ऐसा लिखा नहीं है, इसलिए मैं नहीं बता सकता। – Bozho

4

यह सुनिश्चित नहीं है कि यह "पाई का टुकड़ा" चीज़ है, लेकिन चूंकि आप एक्सएमएल को एक प्रॉपर्टी इंस्टेंस से स्टोर कर सकते हैं और एक्सएमएल से एक इंस्टेंस लोड कर सकते हैं, इसलिए आपके पास एक्सएमएल रखने वाली आपकी इकाई पर @ लॉब प्रॉपर्टी हो सकती है बने रहो। कुछ की तरह:

class MyEntityDAO { 

    public void persist(MyEntity entity){ 

    try { 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     entity.getProps().storeToXML(bos, "a simple comment if you like"); 

     byte[] byteStream = bos.toByteArray(); 
       entity.setXmlProp = byteStream; 

       //save your instance with hibernate... 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 

    public MyEntity retrieveById(Long id){ 

     Properties propFromDB = new Properties(); 

     MyEntity ent = //retrieve the instance with hibernate... 

     try{ 
     Properties propFromDB = new Properties(); 
     ByteArrayInputStream bais = new ByteArrayInputStream(ent.getXmlProp()); 
     propFromDB.load(bais); 
     ent.setProp(propFromDB); 
     return ent; 
     } catch (IOException ioe){ 
     ioe.printStackTrace(); 
     } 
     return null; 
    } 
} 

चेक तरीकों storeToXML और loadFromXML java.util.Properties एपीआई पर:

class MyEntity implements Serializable { 
    @Transient 
    Properties props; 

    @Lob 
    byte[] xmlProp; //the xml as a byte[] 

    //ids, getters & setters ommited 

} 

और फिर आप एक डीएओ लागू कर सकते हैं बने और अपने इकाई को पुन: प्राप्त की कड़ी मेहनत करते हैं।

उम्मीद है कि इससे मदद मिलती है;

+0

बहुत रोचक लुकास। इस विधि के साथ मेरी एकमात्र समस्या यह है कि मैं गुणों में कुंजी/मूल्य जोड़े के आधार पर खोज नहीं कर पाऊंगा। क्या आप इसके आसपास किसी भी तरह से जानते हैं? –

+0

अनिवार्य रूप से आप xmlProp को बाइट [] से स्ट्रिंग में स्विच कर सकते हैं, बाइटएरे * की सामग्री के साथ एक स्ट्रिंग भरें और उस संपत्ति पर स्वयं XML को बनाए रखें। इससे आपको डेटा पूछने की संभावना मिल जाएगी, लेकिन यह हैकी की तरह दिखता है।आप किस तरह की क्वेरी चलाने की कोशिश कर रहे हैं? –

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

  • कोई संबंधित समस्या नहीं^_^