Mapim enum

आदिम डेटा प्रकार कसे मॅप करायचे ते आम्ही आधीच शोधून काढले आहे: आम्ही @Column भाष्य आणि @Type भाष्य वापरतो . परंतु सर्व प्रकरणे या भाष्यांद्वारे कव्हर केली जाऊ शकत नाहीत. आणि सर्वात सामान्य केस म्हणजे enum .

Java enum ऑब्जेक्ट्स डेटाबेसमध्ये दोन प्रकारे संग्रहित केल्या जाऊ शकतात:

  • संख्या म्हणून
  • एक स्ट्रिंग म्हणून

चला एक लहान उदाहरण लिहूया जिथे वापरकर्त्याचा आवडता रंग असेल, जो enum वापरून सेट केला जाईल.


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
  • 'एफ' किंवा 'टी'
  • 'Y' किंवा 'N'

सर्वसाधारणपणे, जर तुम्ही तुमचा बेस डिझाइन करणार असाल, तर लगेच BIT प्रकार लिहिणे चांगले. बरं, त्यासाठी पूर्ण मॅपिंग असे दिसेल:


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

बरं, जर तुम्ही डेटाबेस डिझाइन करत नसाल, तर वरील सारणी पहा आणि तुम्हाला आवश्यक असलेले प्रकार योग्यरित्या कसे मॅप करायचे याचा विचार करा.

गणना केलेली फील्ड

कधीकधी घटक वर्गातील फील्डची संख्या आणि टेबलमधील स्तंभांची संख्या जुळत नाही. याची अनेक कारणे असू शकतात.

सर्वात सामान्य म्हणजे जेव्हा आमच्या एंटिटी क्लासमध्ये काही फील्ड असते जे आम्ही डेटाबेसमध्ये सेव्ह करू इच्छित नाही . यासह सर्व काही स्पष्ट आहे - अशा फील्डमध्ये फक्त @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;
}

सर्व काही ठीक आहे असे दिसते, परंतु Java च्या दृष्टिकोनातून, पत्ता वेगळ्या वर्गात ठेवणे तर्कसंगत असेल. पत्ता अद्याप एक स्वतंत्र अस्तित्व आहे. परंतु ही सर्व माहिती वापरकर्ता टेबलमधील डेटाबेसमध्ये संग्रहित असल्यास हे कसे करावे?

@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 भाष्याबद्दल धन्यवाद, ऑब्जेक्ट सेव्ह करताना, Hibernate ला समजेल की UserAddress क्लासच्या फील्डला User class चे फील्ड मानणे आवश्यक आहे .

महत्वाचे! तुम्ही तुमच्या यूजर क्लासमध्ये दोन UserAddress फील्ड जोडण्याचे ठरविल्यास , @Embedded वापरणे यापुढे कार्य करणार नाही: तुमच्याकडे डुप्लिकेट फील्ड असतील आणि तुम्हाला ते कसे तरी वेगळे करावे लागतील. हे अधिलिखित भाष्य करून केले जाते: @AttributeOverrides भाष्य वापरून .

तुम्ही हे जाणून घ्यावे अशी माझी इच्छा आहे, परंतु आम्ही येथे तपशीलात जाणार नाही. मला असे वाटते की तुमचे डोके फोडण्यासाठी हे पुरेसे आहे. जिज्ञासूंसाठी, मी अधिकृत दस्तऐवजीकरणाची लिंक सोडू शकतो .