2010-01-23 18 views
8

का उपयोग कर कॉलम में ऑब्जेक्ट्स संग्रहीत करना क्या केवल एक तालिका का उपयोग करके निम्न की तरह कुछ स्टोर करना संभव है? अभी, क्या हाइबरनेट करेगा दो टेबल, एक परिवार के लिए और एक लोगों के लिए। मैं परिवार के सदस्यों को डेटाबेस में कॉलम में क्रमबद्ध करने के लिए ऑब्जेक्ट करना चाहता हूं।हाइबरनेट जेपीए

@Entity(name = "family") 
class Family{ 

    private final List<Person> familyMembers; 

} 

class Person{ 

    String firstName, lastName; 
    int age; 

} 
+0

यह स्पष्ट नहीं है। यदि आप व्यक्ति के समूह के रूप में familly देख रहे हैं, तो आपको familly के लिए एक नई मेज की जरूरत है, सिवाय इसके कि आप एक साधारण प्रकार के साथ एक पूर्णांक या एक स्ट्रिंग के साथ familly का प्रतिनिधित्व करते हैं। – Kartoch

+1

ओटी: यह एक खराब डिजाइन होगा। –

+0

यदि किसी परिवार के पास 3 सदस्य हैं, तो डेटाबेस कॉलम में आप किस मूल्य को देखने की उम्मीद करेंगे? –

उत्तर

0

आप pseudoproperty (गेटर और सेटर) जो स्वीकार करता/धारावाहिक रूप देता है बनाते हैं, और @Transient साथ familyMembers टिप्पणी कर सकते हैं। यह अन्य सभी गुणों के लिए, फ़ील्ड नहीं, गेटर्स को एनोटेट करने की भी आवश्यकता होगी।

1

@Column के साथ संपत्ति को एनोटेट करें और पर टाइप को ArrayList परिभाषित करें। और PersonSerializable लागू करें।

लेकिन आपको यह केवल तभी करना चाहिए यदि आपके इरादे बहुत स्पष्ट हैं, क्योंकि यह कुछ दुर्लभ मामलों में सही समाधान है। जैसा कि पास्कल ने नोट किया, अगर आपको कभी भी Person बदलना है तो आपको सिरदर्द होगा।

+0

मुझे पूरा यकीन है कि यह 'java.lang.ClassCastException: java.util.ArrayList को java.sql.blob' –

+0

पर नहीं डाला जा सकता है, हाँ, मैंने अपनी एक कक्षा को देखा जहां मैं हूं एक ही स्थिति होने के साथ - यह withotu लोब, और ठोस प्रकार (ArrayList) निर्दिष्ट करने के साथ काम करता है।उत्तर – Bozho

13

यह एक भयानक डिज़ाइन है और मैं वास्तव में इसकी अनुशंसा नहीं कर रहा हूं (आपको बस एक और टेबल बनाना चाहिए) लेकिन यह संभव है।

सबसे पहले, आपको byte[] विशेषता का उपयोग करने वाले व्यक्तियों की सूची का क्रमबद्ध संस्करण रखने की आवश्यकता होगी जो डेटाबेस में बीएलओबी में संग्रहीत किए जाएंगे। तो @Lob के साथ यह गेटटर एनोटेट करें (मैं गेटटर और सेटर private उन्हें बेनकाब करने के लिए नहीं बनाऊंगा)। फिर, byte[] से List<Person> को वापस करने या सेट करने के लिए "नकली" गेटर और सेटर का पर्दाफाश करें। मैं नीचे दिए गए नमूने में कॉमन्स लैंग से SerializationUtils का उपयोग कर रहा हूं (byte[] से/फ्लाई पर क्रमबद्ध/deserialize करने के लिए यदि आप इस पुस्तकालय को आयात नहीं करना चाहते हैं तो आप अपने स्वयं के सहायक वर्ग प्रदान करते हैं)। @Transcient के साथ "नकली" गेटटर को चिह्नित करना न भूलें या हाइबरनेट एक फ़ील्ड बनाने का प्रयास करेगा (और विफल हो क्योंकि यह List के प्रकार को निर्धारित करने में सक्षम नहीं होगा)।

@Entity(name = "family") 
class Family implements Serializable { 

    // ... 

    private byte[] familyMembersAsByteArray; 

    public Family() {} 

    @Lob 
    @Column(name = "members", length = Integer.MAX_VALUE - 1) 
    private byte[] getFamilyMembersAsByteArray() { // not exposed 
     return familyMembersAsByteArray; 
    } 

    private void setFamilyMembersAsByteArray((byte[] familyMembersAsByteArray() { // not exposed 
     this.familyMembersAsByteArray = familyMembersAsByteArray; 
    } 

    @Transient 
    public List<Person> getFamilyMembers() { 
     return (List<Person>) SerializationUtils.deserialize(familyMembersAsByteArray); 
    } 

    public void setParticipants(List familyMembers) { 
     this.familyMembersAsByteArray = SerializationUtils.serialize((Serializable) familyMembers); 
    } 
} 

भूल मत Person वर्ग Serializable बनाने के लिए और (यहाँ एक डिफ़ॉल्ट मैं सिर्फ दिखा रहा हूँ) एक असली serialVersionUID जोड़ने के लिए:

public class Person implements Serializable { 

    private static final long serialVersionUID = 1L; 

    // ... 

    private String firstName, lastName; 
    private int age; 

} 

लेकिन, मुझे जोर देते हैं, यह एक है भयानक डिजाइन और यह बहुत नाजुक हो जाएगा (Person बदलना बीएलओबी की सामग्री को विसर्जित करने के मुद्दों से बचने के लिए "माइग्रेट" करने की आवश्यकता हो सकती है और यह दर्दनाक हो जाएगा। आपको वास्तव में इस विचार पर पुनर्विचार करना चाहिए और इसके बजाय Person के लिए एक और तालिका का उपयोग करना चाहिए (या मैं नहीं करता आप डेटाबेस का उपयोग क्यों नहीं करते हैं)

+0

अपडेट किया गया है कि आप डेटाबेस व्यक्ति का उपयोग क्यों नहीं कर सकते हैं, शायद इसका उपयोग करना व्यर्थ है? अगर मुझे कुछ चाहिए तो कुछ की सूची स्टोर करें, मुझे इसे अलग डेटाबेस में रखने की आवश्यकता नहीं है। – Enerccio

1
@Type(type = "serializable") 
private List<Person> familyMembers; 

अगर आप हाइबरनेट एनोटेशन का उपयोग नहीं कर सकते हैं इस प्रयास करें:

@Lob 
private Serializable familyMembers; 

public List<Person> getFamilyMembers(){ 
    return (List) familyMembers; 
} 

public void setFamilyMembers(List<Person> family){ 
    familyMembers = family; 
} 
+1

हां, लेकिन यह एक जेपीए एनोटेशन नहीं है। –

+0

उत्तर में अपडेट देखें –

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