Mapim enum

Naisip na namin kung paano magmapa ng mga primitive na uri ng data: ginagamit namin ang @Column annotation at ang @Type annotation . Ngunit hindi lahat ng kaso ay maaaring saklawin ng mga anotasyong ito. At ang pinakakaraniwang kaso ay enum .

Ang mga object ng Java enum ay maaaring maimbak sa database sa dalawang paraan:

  • bilang isang numero
  • bilang isang string

Sumulat tayo ng isang maliit na halimbawa kung saan ang gumagamit ay magkakaroon ng paboritong kulay, na itinakda gamit ang enum.


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

At magdagdag ng field ng kulay sa klase ng User :


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

Kung gusto naming i-save ng Hibernate ang Uri ng Kulay sa base bilang mga numero , kailangan namin ang fieldpaboritong kulaymagdagdag ng anotasyon:


@Enumerated(EnumType.ORDINAL)

Kung nais nating maiimbak ang mga halaga bilang mga string , kailangan nating magdagdag ng annotation:


@Enumerated(EnumType.STRING)

Halimbawa:


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

Mapim Boolean

Ang pangalawang kapaki-pakinabang na senaryo ay boolean type mapping. Nangyari lamang sa kasaysayan na ang SQL ay walang sariling uri ng data para sa Boolean at kahit ano ay ginagamit doon sa halip.

Ang tatlong pinakakaraniwang opsyon ay:

  • 1 o 0
  • 'Depensa'
  • 'Y' o 'N'

Sa pangkalahatan, kung ididisenyo mo ang iyong base, mas mainam na isulat kaagad ang uri ng BIT. Well, ang buong pagmamapa para dito ay magiging ganito:


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

Buweno, kung hindi ka nagdidisenyo ng database, pagkatapos ay tingnan ang talahanayan sa itaas at isipin kung paano tama ang pagmamapa ng mga uri na kailangan mo.

Mga kalkuladong field

Minsan ang bilang ng mga field sa isang klase ng Entity at ang bilang ng mga column sa isang talahanayan ay hindi tugma. Maaaring may ilang dahilan para dito.

Ang pinakakaraniwan ay kapag mayroong ilang field sa aming Entity class na hindi namin gustong i-save sa database. Malinaw ang lahat dito - idagdag lamang ang @Transient annotation sa naturang field at hindi ito papansinin ng Hibernate kapag nagtatrabaho sa database.

Halimbawa:


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

Ito ay isang magandang opsyon, ngunit kapag nagbabasa ng isang bagay mula sa database, ang kabuuang field ay magiging null. At gusto naming maglaman ito ng produkto ng lapad*taas. Magagawa rin ito sa Hibernate. Mayroong espesyal na @Formula annotation para dito .


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

Ang nasabing field ay hindi mase-save sa database, at kapag ang bagay ay nabasa mula sa database, ang halaga na kinakalkula ng formula ay isusulat dito.

Magiging ganito ang hitsura ng SQL query:

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

@Naka-embed

Ang isa pang kapaki-pakinabang na anotasyon ay @Embedded . Pinapayagan ka nitong isaalang-alang ang mga field ng child object bilang mga field ng Entity class mismo.

Sabihin nating mayroon kang klase ng User at nagpasya kang magdagdag ng address dito:


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

Ang lahat ay tila maayos, ngunit mula sa punto ng view ng Java, magiging lohikal na ilagay ang address sa isang hiwalay na klase. Ang address ay isa pa ring hiwalay na entity. Ngunit paano ito gagawin kung ang lahat ng impormasyong ito ay naka-imbak sa database sa talahanayan ng gumagamit?

Makakatulong sa amin ang @Embedded na anotasyon . Una, gagawa kami ng klase ng UserAddress at ilagay ang lahat ng impormasyon sa address ng user dito:


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

At pagkatapos ay gumagamit kami ng isang patlang ng klase na ito sa aming klase ng User :


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

Salamat sa @Embedded annotation, sa oras ng pag-save ng object, mauunawaan ng Hibernate na ang mga field ng UserAddress class ay kailangang ituring bilang mga field ng User class mismo .

Mahalaga! Kung magpasya kang magdagdag ng dalawang field ng UserAddress sa iyong klase ng User , hindi na gagana ang paggamit ng @Embedded : magkakaroon ka ng mga duplicate na field at kakailanganin mong paghiwalayin ang mga ito kahit papaano. Ginagawa ito sa pamamagitan ng pag-override ng mga anotasyon: gamit ang @AttributeOverrides na anotasyon .

Gusto kong malaman mo ito, ngunit hindi na namin idedetalye dito. Sa tingin ko ay sapat na ito para sirain mo ang iyong ulo. Para sa mausisa, maaari akong mag-iwan ng link sa opisyal na dokumentasyon .