संग्रह की सूची

ठीक है, आपने देखा है कि सरल प्रकारों को कैसे मैप किया जाता है। अब समय आ गया है कि अधिक दिलचस्प प्रश्नों पर आगे बढ़ें - वस्तुओं के संग्रह को कैसे मैप करें।

और हमारे पास 5 समूहों में वस्तुएँ हो सकती हैं:

  • ऐरे - वस्तुओं की एक सरणी
  • सूची - वस्तुओं की सूची
  • सेट - वस्तुओं का सेट
  • नक्शा - वस्तुओं का एक शब्दकोश
  • संग्रह - वस्तुओं का संग्रह

और संग्रह क्षेत्र वाले वर्ग का एक उदाहरण:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @magical-annotation
   public List messages;
}

तो यह जादुई एनोटेशन क्या है जो हमें एक क्षेत्र नहीं, बल्कि कई मूल्यों को संग्रहीत करने की अनुमति देगा?

इस एनोटेशन को @ElementCollection कहा जाता है । उदाहरण:

@Entity
@Table(name="user")
class User  {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   public List<String> messages;
}

यह बहुत सरलता से लिखा गया है, लेकिन यह गैर-तुच्छ रूप से काम करता है।

सहायक तालिका

इकाई वर्ग के सभी क्षेत्र जिनमें कई तत्व होते हैं और @ElementCollection एनोटेशन के साथ चिह्नित होते हैं , एक विशेष सहायक तालिका में डेटाबेस में समाहित होते हैं। जो वास्तव में तार्किक है।

इस तालिका में दो रूपों में डेटा हो सकता है:

  • आदेशित (सूची, मानचित्र) में तीन कॉलम होते हैं:
    • कुंजी कॉलम (विदेशी कुंजी) - मूल वस्तु की आईडी का संदर्भ।
    • इंडेक्स कॉलम - संग्रह में स्थिति/इंडेक्स।
    • तत्व स्तंभ - मान।
  • अक्रमित (सेट) में दो कॉलम होते हैं:
    • कुंजी कॉलम (विदेशी कुंजी) - मूल वस्तु की आईडी का संदर्भ।
    • तत्व स्तंभ - मान।

आप एनोटेशन का उपयोग करके स्पष्ट रूप से इस तालिका का नाम भी सेट कर सकते हैं:

@CollectionTable(name="table_name")

उदाहरण:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message")
   public List<String> messages;
}

महत्वपूर्ण! यदि @CollectionTable एनोटेशन निर्दिष्ट नहीं है, तो हाइबरनेट वर्ग के नाम और फ़ील्ड के नाम के आधार पर तालिका का नाम स्वयं बनाएगा: उपयोगकर्ता वर्ग और फ़ील्डसंदेशोंतालिका का नाम "User_messages" रखें।

संग्रह संग्रह

लेकिन आइए सहायक तालिका के निर्माण को हाइबरनेट पर न छोड़ें और इसे स्वयं बनाएं। सबसे पहले हमें दो कॉलम के साथ एक टेबल बनाने की जरूरत है:

CREATE TABLE user_message {
    user_id INT,
    message VARCHAR(255)
};

ध्यान दें कि इस टेबल का अपना आईडी-कॉलम नहीं है। यह सहायक तालिकाओं की मुख्य विशेषता है। आप थोड़ी देर बाद अन्य प्रकार की सहायक तालिकाओं से परिचित होंगे।

अब हमें इस तालिका को अपने क्षेत्र में मैप करने की जरूरत हैसंदेशोंउपयोगकर्ता वर्ग में । यह ऐसा दिखाई देगा:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message", joinColumns = @JoinColumn(name = "user_id"))
   @Column(name = "message")
   public Set<String> messages;
}

यहाँ दो बातों पर ध्यान देने योग्य है।

सबसे पहले, @Column(name = "message") एनोटेशन के साथ निर्दिष्ट संदेश स्तंभ , user_message सहायक तालिका में है, उपयोगकर्ता तालिका में नहीं।

दूसरे, @JoinColumn(name = "user_id") एनोटेशन में , हमने user_id कॉलम का नाम निर्दिष्ट किया है, जो उपयोगकर्ता तालिका की आईडी को संदर्भित करता है। ऐसा इसलिए है ताकि हाइबरनेट जानता हो कि उन्हें सही तरीके से कैसे संयोजित किया जाए।

संग्रह

यदि आप किसी सहायक तालिका में किसी सूची या सरणी के आदेशित तत्वों को संग्रहीत करना चाहते हैं, तो आपको तीन स्तंभों वाली तालिका की आवश्यकता है:

CREATE TABLE user_message {
    user_id INT,
    index INT,
    message VARCHAR(255)
};

यदि आपको कॉलम नाम "इंडेक्स" पसंद नहीं है, या आप इसे बदल नहीं सकते हैं, तो आप मैपिंग के दौरान एक अलग नाम निर्दिष्ट कर सकते हैं। ऐसा करने के लिए, आपको @Index एनोटेशन का उपयोग करने की आवश्यकता है ।

उदाहरण:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message",
       	indexes = { @Index(columnList = "list_index") }
       	joinColumns = @JoinColumn(name = "user_id"))
   @Column(name = "message")
   public List<String> messages;
}

नक्शा संग्रह

और अंत में, आप न केवल एक संग्रह, बल्कि एक हैश मैप स्टोर करना चाहते हैं, और इसके लिए आपको सहायक तालिका में दो कॉलम चाहिए:

CREATE TABLE user_message {
    user_id INT,
    key VARCHAR(255),
    message VARCHAR(255)
};

मानचित्र के लिए कुंजी निर्दिष्ट करने के लिए, आपको @MapKeyColumn एनोटेशन की आवश्यकता है ।

उदाहरण:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message", joinColumns = @JoinColumn(name = "user_id"))
   @MapKeyColumn(name = "key")
   @Column(name = "message")
   public Map<String, String> messages;
}

आप आधिकारिक दस्तावेज में अधिक जानकारी प्राप्त कर सकते हैं ।