संग्रहांची यादी

बरं, तुम्ही साधे प्रकार कसे मॅप करायचे ते पाहिले आहे. आता अधिक मनोरंजक प्रश्नांकडे जाण्याची वेळ आली आहे - वस्तूंचे संकलन कसे मॅप करावे.

आणि आपल्याकडे 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;
}

आपण अधिकृत दस्तऐवजात अधिक माहिती शोधू शकता .