Mapim enum

Kami telah mengetahui cara memetakan tipe data primitif: kami menggunakan anotasi @Column dan anotasi @Type . Tetapi tidak semua kasus dapat dicakup oleh anotasi ini. Dan kasus yang paling umum adalah enum .

Objek Java enum dapat disimpan dalam database dengan dua cara:

  • sebagai nomor
  • sebagai string

Mari tulis contoh kecil di mana pengguna akan memiliki warna favorit, yang disetel menggunakan enum.


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

Dan tambahkan bidang warna ke kelas Pengguna :


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

Jika kita ingin Hibernate menyimpan tipe Color ke basis sebagai angka , maka kita memerlukan bidangnyawarna kesukaantambahkan anotasi:


@Enumerated(EnumType.ORDINAL)

Jika kita ingin nilai disimpan sebagai string , maka kita perlu menambahkan anotasi:


@Enumerated(EnumType.STRING)

Contoh:


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

Petakan Boolean

Skenario berguna kedua adalah pemetaan tipe boolean. Kebetulan secara historis bahwa SQL tidak memiliki tipe datanya sendiri untuk Boolean dan apa pun digunakan di sana.

Tiga opsi yang paling umum adalah:

  • 1 atau 0
  • 'F' atau 'T'
  • 'Y' atau 'T'

Secara umum, jika Anda akan mendesain basis Anda, lebih baik segera menulis tipe BIT. Nah, pemetaan lengkapnya akan terlihat seperti ini:


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

Nah, jika Anda tidak mendesain database, lihat tabel di atas dan pikirkan cara memetakan tipe yang Anda butuhkan dengan benar.

Bidang terhitung

Terkadang jumlah bidang dalam kelas Entitas dan jumlah kolom dalam tabel tidak cocok. Mungkin ada beberapa alasan untuk ini.

Yang paling umum adalah ketika ada beberapa bidang di kelas Entitas kita yang tidak ingin kita simpan ke database. Semuanya jelas dengan ini - cukup tambahkan anotasi @Transient ke bidang tersebut dan Hibernate akan mengabaikannya saat bekerja dengan database.

Contoh:


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

Ini adalah opsi yang bagus, tetapi saat membaca objek dari database, bidang total akan menjadi nol. Dan kami ingin mengandung produk lebar * tinggi. Ini juga bisa dilakukan di Hibernasi. Ada anotasi @Formula khusus untuk ini .


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

Bidang seperti itu tidak akan disimpan ke database, dan ketika objek dibaca dari database, nilai yang dihitung dengan rumus akan dituliskan padanya.

Permintaan SQL akan terlihat seperti ini:

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

@ Tertanam

Anotasi berguna lainnya adalah @Embedded . Ini memungkinkan Anda untuk mempertimbangkan bidang objek anak sebagai bidang kelas Entitas itu sendiri.

Katakanlah Anda memiliki kelas Pengguna dan Anda memutuskan untuk menambahkan alamat ke dalamnya:


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

Segalanya tampak baik-baik saja, tetapi dari sudut pandang Java, masuk akal untuk meletakkan alamat di kelas terpisah. Alamatnya masih merupakan entitas yang terpisah. Tetapi bagaimana melakukannya jika semua informasi ini disimpan dalam database di tabel pengguna?

Anotasi @Embedded akan membantu kami . Pertama, kita akan membuat kelas UserAddress dan memasukkan semua informasi alamat pengguna ke dalamnya:


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

Dan kemudian kami menggunakan bidang kelas ini di kelas Pengguna kami :


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

Berkat anotasi @Embedded , pada saat menyimpan objek, Hibernate akan memahami bahwa bidang kelas UserAddress perlu diperlakukan sebagai bidang kelas Pengguna itu sendiri .

Penting! Jika Anda memutuskan untuk menambahkan dua kolom UserAddress ke kelas User Anda , maka menggunakan @Embedded tidak akan berfungsi lagi: Anda akan memiliki kolom duplikat dan Anda harus memisahkannya. Ini dilakukan dengan mengganti anotasi: menggunakan anotasi @AttributeOverrides .

Saya ingin Anda mengetahui hal ini, tetapi kami tidak akan membahasnya secara mendetail di sini. Saya pikir ini cukup bagi Anda untuk mematahkan kepala Anda. Bagi yang penasaran, saya dapat meninggalkan tautan ke dokumentasi resmi .