मैपिम एनम

हमने पहले ही पता लगा लिया है कि आदिम डेटा प्रकारों को कैसे मैप किया जाए: हम @ कॉलम एनोटेशन और @ टाइप एनोटेशन का उपयोग करते हैं । लेकिन सभी मामलों को इन एनोटेशन से कवर नहीं किया जा सकता है। और सबसे आम मामला है एनम

जावा एनम ऑब्जेक्ट्स को डेटाबेस में दो तरह से स्टोर किया जा सकता है:

  • एक संख्या के रूप में
  • एक तार के रूप में

आइए एक छोटा सा उदाहरण लिखते हैं जहां उपयोगकर्ता का पसंदीदा रंग होगा, जो एनम का उपयोग करके सेट किया गया है।


enum Color {
   RED,
   ORANGE,
   YELLOW,
   GREEN,
   BLUE,
   VIOLET
}

और उपयोगकर्ता वर्ग में रंग फ़ील्ड जोड़ें :


@Entity
@Table(name="user")
class User
{
   @Column(name="id")
   public Integer id;
 
   @Column(name="favorite_color")
   public Color favoriteColor;
 
   @Column(name="created_date")
   public Date createdDate;
}

यदि हम चाहते हैं कि हाइबरनेट रंग प्रकार को आधार के रूप में संख्या के रूप में सहेजे , तो हमें फ़ील्ड की आवश्यकता हैपसंदीदा रंगएनोटेशन जोड़ें:


@Enumerated(EnumType.ORDINAL)

यदि हम चाहते हैं कि मानों को स्ट्रिंग्स के रूप में संग्रहीत किया जाए , तो हमें एक एनोटेशन जोड़ने की आवश्यकता है:


@Enumerated(EnumType.STRING)

उदाहरण:


@Entity
@Table(name="user")
class User
{
   @Column(name="id")
   public Integer id;
 
   @Enumerated(EnumType.ORDINAL) //value will be saved to the base as a number
   @Column(name="favorite_color")
   public Color favoriteColor;
 
   @Column(name="created_date")
   public Date createdDate;
}

मैपिम बूलियन

दूसरा उपयोगी परिदृश्य बूलियन टाइप मैपिंग है। ऐसा ऐतिहासिक रूप से हुआ है कि बूलियन के लिए एसक्यूएल का अपना डेटा प्रकार नहीं है और इसके बजाय वहां कुछ भी उपयोग किया जाता है।

तीन सबसे आम विकल्प हैं:

  • 1 या 0
  • 'एफ' या 'टी'
  • 'वाई' या 'एन'

सामान्य तौर पर, यदि आप अपना आधार डिजाइन करने जा रहे हैं, तो बेहतर होगा कि आप तुरंत BIT टाइप लिखें। खैर, इसके लिए पूरी मैपिंग इस तरह दिखेगी:


	@Column(name = "is_correct", columnDefinition = "BIT")
	@Type(type = "org.hibernate.type.NumericBooleanType")
    private Boolean isCorrect;

ठीक है, यदि आप डेटाबेस को डिज़ाइन नहीं कर रहे हैं, तो ऊपर दी गई तालिका देखें और सोचें कि आपको किस प्रकार की ज़रूरतों को सही तरीके से मैप करना है।

परिकलित फ़ील्ड

कभी-कभी एक इकाई वर्ग में फ़ील्ड की संख्या और तालिका में कॉलम की संख्या मेल नहीं खाती। इस के लिए कई कारण हो सकते है।

सबसे आम तब होता है जब हमारे Entity वर्ग में कुछ फ़ील्ड होता है जिसे हम डेटाबेस में सहेजना नहीं चाहते हैं । इसके साथ सब कुछ स्पष्ट है - बस ऐसे क्षेत्र में @Transient एनोटेशन जोड़ें और डेटाबेस के साथ काम करते समय हाइबरनेट इसे अनदेखा कर देगा।

उदाहरण:


@Entity(name = "Square")
public class Square {
           	@Id
           	public Long id;
 
           	public Integer width;
 
           	public Integer height;
 
           	@Transient
           	public Integer total;
}

यह एक अच्छा विकल्प है, लेकिन डेटाबेस से किसी वस्तु को पढ़ते समय, कुल क्षेत्र शून्य होगा। और हम चाहते हैं कि इसमें चौड़ाई*ऊंचाई का गुणनफल हो। यह हाइबरनेट में भी किया जा सकता है। इसके लिए एक विशेष @Formula एनोटेशन है ।


@Entity(name = "Square")
public class Square {
           	@Id
           	public Long id;
 
           	public Integer width;
 
           	public Integer height;
 
           	@Formula(value = " width * height ")
          	public Integer total;
}

ऐसा फ़ील्ड डेटाबेस में सहेजा नहीं जाएगा, और जब डेटाबेस से ऑब्जेक्ट पढ़ा जाता है, तो सूत्र द्वारा गणना की गई वैल्यू उसमें लिखी जाएगी।

SQL क्वेरी कुछ इस तरह दिखेगी:

 SELECT id, width, height, (width* height) AS total FROM Square;

@अंतर्निहित

एक अन्य उपयोगी एनोटेशन @Embedded है । यह आपको बाल वस्तु के क्षेत्र को इकाई वर्ग के क्षेत्र के रूप में मानने की अनुमति देता है।

मान लीजिए कि आपके पास एक उपयोगकर्ता वर्ग है और आप इसमें एक पता जोड़ने का निर्णय लेते हैं:


@Entity
@Table(name="user")
class User
{
   @Column(name="id")
    public Integer id;
 
   @Column(name="user_address_country")
   public String country;
   @Column(name="user_address_city")
   public String city;
   @Column(name="user_address_street")
   public String street;
   @Column(name="user_address_home")
   public String home;
 
   @Column(name="created_date")
    public Date createdDate;
}

ऐसा लगता है कि सब कुछ ठीक है, लेकिन जावा के दृष्टिकोण से, पते को एक अलग वर्ग में रखना तर्कसंगत होगा। पता अभी भी एक अलग इकाई है। लेकिन यह कैसे करें यदि यह सारी जानकारी डेटाबेस में उपयोगकर्ता तालिका में संग्रहीत है?

@Embedded एनोटेशन हमारी मदद करेगा । सबसे पहले, हम UserAddress क्लास बनाएंगे और उसमें यूजर के एड्रेस की सारी जानकारी डालेंगे:


@Embeddable
class UserAddress
{
   @Column(name="user_address_country")
   public String country;
   @Column(name="user_address_city")
   public String city;
   @Column(name="user_address_street")
   public String street;
   @Column(name="user_address_home")
   public String home;
}

और फिर हम अपने उपयोगकर्ता वर्ग में इस वर्ग के एक क्षेत्र का उपयोग करते हैं :


@Entity
@Table(name="user")
class User
{
   @Column(name="id")
   public Integer id;
 
   @Embedded
   public UserAddress address;
 
   @Column(name="created_date")
   public Date createdDate;
}

@Embedded एनोटेशन के लिए धन्यवाद, ऑब्जेक्ट को सहेजते समय, हाइबरनेट समझ जाएगा कि UserAddress वर्ग के फ़ील्ड को उपयोगकर्ता वर्ग के फ़ील्ड के रूप में ही माना जाना चाहिए ।

महत्वपूर्ण! यदि आप अपने User वर्ग में दो UserAddress फ़ील्ड जोड़ने का निर्णय लेते हैं , तो @Embedded का उपयोग करना अब काम नहीं करेगा: आपके पास डुप्लिकेट फ़ील्ड होंगे और आपको उन्हें किसी तरह अलग करने की आवश्यकता होगी। यह एनोटेशन ओवरराइड करके किया जाता है: @AttributeOverrides एनोटेशन का उपयोग करके ।

मैं चाहता हूं कि आप इसे जानें, लेकिन हम यहां इसके विस्तार में नहीं जाएंगे। मुझे लगता है कि यह आपके लिए अपना सिर फोड़ने के लिए काफी है। जिज्ञासुओं के लिए, मैं आधिकारिक दस्तावेज के लिए एक लिंक छोड़ सकता हूं ।