మాపిమ్ ఎనమ్

ఆదిమ డేటా రకాలను ఎలా మ్యాప్ చేయాలో మేము ఇప్పటికే గుర్తించాము: మేము @కాలమ్ ఉల్లేఖనాన్ని మరియు @రకం ఉల్లేఖనాన్ని ఉపయోగిస్తాము . కానీ ఈ ఉల్లేఖనాల ద్వారా అన్ని కేసులను కవర్ చేయలేరు. మరియు అత్యంత సాధారణ కేసు enum .

జావా 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;
}

మాపిమ్ బూలియన్

రెండవ ఉపయోగకరమైన దృశ్యం బూలియన్ రకం మ్యాపింగ్. బూలియన్ కోసం SQL దాని స్వంత డేటా రకాన్ని కలిగి ఉండదు మరియు బదులుగా ఏదైనా ఉపయోగించబడుతుందని ఇది చారిత్రాత్మకంగా జరిగింది.

మూడు అత్యంత సాధారణ ఎంపికలు:

  • 1 లేదా 0
  • 'F' లేదా 'T'
  • '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;
}

ఇది మంచి ఎంపిక, కానీ డేటాబేస్ నుండి వస్తువును చదివేటప్పుడు, మొత్తం ఫీల్డ్ శూన్యంగా ఉంటుంది. మరియు వెడల్పు*ఎత్తు యొక్క ఉత్పత్తిని కలిగి ఉండాలని మేము కోరుకుంటున్నాము. ఇది హైబర్నేట్‌లో కూడా చేయవచ్చు. దీని కోసం ప్రత్యేక @ఫార్ములా ఉల్లేఖన ఉంది .


@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;
}

అంతా బాగానే ఉంది, కానీ జావా కోణం నుండి, చిరునామాను ప్రత్యేక తరగతిలో ఉంచడం లాజికల్‌గా ఉంటుంది. చిరునామా ఇప్పటికీ ఒక ప్రత్యేక అంశం. అయితే ఈ సమాచారం మొత్తం యూజర్ టేబుల్‌లోని డేటాబేస్‌లో నిల్వ చేయబడితే దీన్ని ఎలా చేయాలి?

@ఎంబెడెడ్ ఉల్లేఖనం మాకు సహాయం చేస్తుంది . మొదట, మేము వినియోగదారు చిరునామా తరగతిని సృష్టిస్తాము మరియు వినియోగదారు చిరునామాలోని మొత్తం సమాచారాన్ని అందులో ఉంచుతాము:


@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;
}

@ఎంబెడెడ్ ఉల్లేఖనానికి ధన్యవాదాలు, ఆబ్జెక్ట్‌ను సేవ్ చేసే సమయంలో, యూజర్ అడ్రస్ క్లాస్ ఫీల్డ్‌లను యూజర్ క్లాస్‌లోని ఫీల్డ్‌లుగా పరిగణించాల్సిన అవసరం ఉందని హైబర్నేట్ అర్థం చేసుకుంటుంది .

ముఖ్యమైనది! మీరు మీ వినియోగదారు తరగతికి రెండు UserAddress ఫీల్డ్‌లను జోడించాలని నిర్ణయించుకుంటే , @Embedded ఉపయోగించడం ఇకపై పని చేయదు: మీకు నకిలీ ఫీల్డ్‌లు ఉంటాయి మరియు మీరు వాటిని ఎలాగైనా వేరు చేయాలి. ఇది ఉల్లేఖనాలను భర్తీ చేయడం ద్వారా చేయబడుతుంది: @AttributeOverrides ఉల్లేఖనాన్ని ఉపయోగించి .

మీరు దీన్ని తెలుసుకోవాలని నేను కోరుకుంటున్నాను, కానీ మేము ఇక్కడ వివరంగా చెప్పము. మీ తల పగలడానికి ఇది సరిపోతుందని నేను భావిస్తున్నాను. ఆసక్తి ఉన్నవారి కోసం, నేను అధికారిక డాక్యుమెంటేషన్‌కి లింక్‌ను ఉంచగలను .