Mendefinisikan Entitas JPA

1. Perkenalan

Dalam tutorial ini, kita akan belajar tentang dasar-dasar entitas bersama dengan berbagai anotasi yang mendefinisikan dan menyesuaikan entitas di JPA.

2. Entitas

Entitas di JPA tidak lain adalah POJO yang mewakili data yang dapat disimpan ke database. Entitas mewakili tabel yang disimpan dalam database. Setiap instance dari suatu entitas mewakili satu baris dalam tabel.

2.1. The Entity Anotasi

Katakanlah kita memiliki POJO bernama Student yang mewakili data siswa dan kita ingin menyimpannya di database.

public class Student { // fields, getters and setters }

Untuk melakukan ini, kita harus menentukan entitas sehingga JPA menyadarinya.

Jadi mari kita mendefinisikan dengan memanfaatkan @ Entity penjelasan. Kita harus menentukan anotasi ini di tingkat kelas. Kita juga harus memastikan bahwa entitas memiliki konstruktor no-arg dan kunci utama:

@Entity public class Student { // fields, getters and setters }

Nama entitas default ke nama kelas. Kita dapat mengubah namanya menggunakan elemen nama .

@Entity(name="student") public class Student { // fields, getters and setters }

Karena berbagai implementasi JPA akan mencoba mensubclass entitas kita untuk menyediakan fungsionalitasnya, kelas entitas tidak boleh dinyatakan final .

2.2. The Id Anotasi

Setiap entitas JPA harus memiliki kunci utama yang secara unik mengidentifikasinya. The @ Id penjelasan mendefinisikan kunci primer. Kita bisa menghasilkan pengenal dengan cara berbeda yang ditentukan oleh anotasi @GeneratedValue .

Kita dapat memilih dari empat strategi generasi id dengan elemen strategi . Nilainya bisa AUTO, TABLE, SEQUENCE, atau IDENTITY.

@Entity public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private String name; // getters and setters }

Jika kita menentukan GenerationType . AUTO , penyedia JPA akan menggunakan strategi apa pun yang diinginkan untuk menghasilkan pengenal.

Jika kita menganotasi bidang entitas, penyedia JPA akan menggunakan bidang ini untuk mendapatkan dan menyetel status entitas. Selain Akses Lapangan, kita juga dapat melakukan Akses Properti atau Akses Campuran, yang memungkinkan kita menggunakan akses Bidang dan Properti dalam entitas yang sama .

2.3. The Table Anotasi

Dalam kebanyakan kasus, nama tabel di database dan nama entitas tidak akan sama.

Dalam kasus ini, kita dapat menentukan nama tabel menggunakan anotasi @Table :

@Entity @Table(name="STUDENT") public class Student { // fields, getters and setters }

Kami juga dapat menyebutkan skema menggunakan elemen skema :

@Entity @Table(name="STUDENT", schema="SCHOOL") public class Student { // fields, getters and setters }

Nama skema membantu membedakan satu set tabel dari yang lain,

Jika kita tidak menggunakan anotasi @Table , nama entitas akan dianggap sebagai nama tabel.

2.4. The Kolom Anotasi

Sama seperti anotasi @Table , kita dapat menggunakan anotasi @Column untuk menyebutkan detail kolom di tabel.

The @column penjelasan memiliki banyak unsur seperti nama, panjang, nullable, dan unik .

@Entity @Table(name="STUDENT") public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(name="STUDENT_NAME", length=50, nullable=false, unique=false) private String name; // other fields, getters and setters }

The nama elemen menentukan nama kolom dalam tabel. The panjang elemen menentukan panjangnya. The nullable menspesifikasikan elemen apakah kolom adalah nullable atau tidak, dan unik menspesifikasikan elemen apakah kolom unik.

Jika kami tidak menentukan anotasi ini, nama bidang akan dianggap sebagai nama kolom di tabel.

2.5. The Transient Anotasi

Terkadang, kami mungkin ingin membuat bidang menjadi tidak persisten. Kita dapat menggunakan anotasi @Transient untuk melakukannya. Ini menentukan bahwa bidang tidak akan dipertahankan.

Misalnya, kami dapat menghitung usia seorang siswa dari tanggal lahir.

Jadi, mari kita beri anotasi usia bidang dengan anotasi @Transient :

@Entity @Table(name="STUDENT") public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(name="STUDENT_NAME", length=50, nullable=false) private String name; @Transient private Integer age; // other fields, getters and setters }

Akibatnya, usia lapangan tidak akan dipertahankan di tabel.

2.6. The Temporal Anotasi

Dalam beberapa kasus, kita mungkin harus menyimpan nilai temporal di tabel kita.

Untuk ini, kami memiliki anotasi @Temporal :

@Entity @Table(name="STUDENT") public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(name="STUDENT_NAME", length=50, nullable=false, unique=false) private String name; @Transient private Integer age; @Temporal(TemporalType.DATE) private Date birthDate; // other fields, getters and setters }

Namun, dengan JPA 2.2, kami juga memiliki dukungan untuk java.time.LocalDate, java.time.LocalTime, java.time.LocalDateTime, java.time.OffsetTime, dan java.time.OffsetDateTime.

2.7. The Dicacah Anotasi

Terkadang, kami mungkin ingin mempertahankan tipe enum Java .

Kita dapat menggunakan anotasi @Enumerated untuk menentukan apakah enum harus dipertahankan menurut nama atau ordinal (default).

public enum Gender { MALE, FEMALE } 
@Entity @Table(name="STUDENT") public class Student { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(name="STUDENT_NAME", length=50, nullable=false, unique=false) private String name; @Transient private Integer age; @Temporal(TemporalType.DATE) private Date birthDate; @Enumerated(EnumType.STRING) private Gender gender; // other fields, getters and setters }

Sebenarnya, kita tidak perlu menentukan anotasi @Enumerated sama sekali jika kita ingin mempertahankan Gender dengan ordinal enum .

Namun, untuk mempertahankan Jenis Kelamin menurut nama enum , kami telah mengonfigurasi anotasi dengan EnumType.STRING.

3. Kesimpulan

Di artikel ini, kami mempelajari apa itu entitas JPA dan cara membuatnya. Kami juga belajar tentang berbagai anotasi yang dapat digunakan untuk menyesuaikan entitas lebih lanjut.

Kode lengkap untuk artikel ini dapat ditemukan di Github.