Mapim enum

Kita wis ngerti carane peta jinis data primitif: kita nggunakake @Column anotasi lan @Type anotasi . Nanging ora kabeh kasus bisa dilindhungi dening anotasi kasebut. Lan kasus sing paling umum yaiku enum .

Objek enum Jawa bisa disimpen ing basis data kanthi rong cara:

  • minangka nomer
  • minangka senar

Ayo nulis conto cilik ing ngendi pangguna bakal duwe warna favorit, sing disetel nggunakake enum.


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

Lan tambahake kolom warna menyang kelas Panganggo :


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

Yen kita pengin Hibernate nyimpen jinis Warna menyang basis minangka nomer , mula kita butuh lapanganWarna favoritnambahi anotasi:


@Enumerated(EnumType.ORDINAL)

Yen kita pengin nilai disimpen minangka strings , banjur kita kudu nambah anotasi:


@Enumerated(EnumType.STRING)

Tuladha:


@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

Skenario migunani kapindho yaiku pemetaan jinis boolean. Iku mung kedadeyan historis yen SQL ora duwe jinis data dhewe kanggo Boolean lan apa wae sing digunakake ing kana.

Telung opsi sing paling umum yaiku:

  • 1 utawa 0
  • 'Bèntèng'
  • 'Y' utawa 'N'

Umumé, yen sampeyan arep ngrancang basis sampeyan, luwih becik nulis jinis BIT langsung. Inggih, pemetaan lengkap bakal katon kaya iki:


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

Inggih, yen sampeyan ora ngrancang database, banjur ndeleng tabel ing ndhuwur lan mikir babagan carane bener map jinis sing perlu.

Bidang sing diwilang

Kadhangkala jumlah kolom ing kelas Entitas lan jumlah kolom ing tabel ora cocog. Ana sawetara alasan kanggo iki.

Sing paling umum yaiku nalika ana sawetara lapangan ing kelas Entitas sing ora pengin disimpen ing database. Kabeh wis jelas karo iki - mung tambahake anotasi @Transient menyang lapangan kasebut lan Hibernate bakal nglirwakake nalika nggarap database.

Tuladha:


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

Iki minangka pilihan sing apik, nanging nalika maca obyek saka database, lapangan total bakal null. Lan kita pengin ngemot produk saka jembaré * dhuwur. Iki uga bisa ditindakake ing Hibernate. Ana anotasi @Formula khusus kanggo iki .


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

Kolom kasebut ora bakal disimpen ing database, lan nalika obyek diwaca saka database, nilai sing diwilang kanthi rumus bakal ditulis.

Pitakonan SQL bakal katon kaya iki:

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

@Ditempelake

Anotasi liyane sing migunani yaiku @Embedded . Iki ngidini sampeyan nimbang lapangan obyek anak minangka lapangan kelas Entitas dhewe.

Contone, sampeyan duwe kelas Panganggo lan sampeyan mutusake kanggo nambah alamat kasebut:


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

Kabeh katon apik, nanging saka sudut pandang Jawa, bakal logis yen alamat kasebut dilebokake ing kelas sing kapisah. Alamat kasebut isih dadi entitas sing kapisah. Nanging carane nindakake iki yen kabeh informasi iki disimpen ing database ing tabel pangguna?

Anotasi @Embedded bakal mbantu kita . Pisanan, kita bakal nggawe kelas UserAddress lan sijine kabeh informasi ing alamat pangguna menyang:


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

Banjur kita nggunakake lapangan kelas iki ing kelas Panganggo :


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

Thanks kanggo anotasi @Embedded , nalika nyimpen obyek kasebut, Hibernate bakal ngerti yen kolom kelas UserAddress kudu dianggep minangka kolom saka kelas User dhewe .

Penting! Yen sampeyan arep nambah rong kolom UserAddress menyang kelas Panganggo sampeyan , banjur nggunakake @Embedded ora bakal bisa digunakake maneh: sampeyan bakal duwe lapangan duplikat lan sampeyan kudu misahake. Iki ditindakake kanthi ngganti anotasi: nggunakake anotasi @AttributeOverrides .

Aku pengin sampeyan ngerti iki, nanging kita ora bakal rinci ing kene. Aku iki cukup kanggo sampeyan kanggo break sirah. Kanggo sing penasaran, aku bisa ninggalake link menyang dokumentasi resmi .