6.1 Manajemen ketergantungan yang mendalam
Dan beberapa hal yang lebih bermanfaat dan menarik tentang anotasi @OneToMany dan sejenisnya. Mereka semua memiliki 4 opsi yang umum digunakan:
- cascade = CascadeType.ALL
- anak yatimRemoval = true
- ambil = FetchType.LAZY
Sekarang kami akan menganalisisnya secara lebih rinci. Dan kita akan mulai dengan yang paling menarik - CascadeType . Parameter ini menentukan apa yang akan terjadi pada entitas dependen jika kita mengubah entitas utama.
Spesifikasi JPA memiliki nilai berikut untuk parameter ini:
- SEMUA
- BERTAHAN
- MENGGABUNGKAN
- MENGHAPUS
- MENYEGARKAN
- MELEPASKAN
Namun, Hibernate memperluas spesifikasi ini menjadi tiga opsi lagi:
- MENGULANGI
- SIMPAN_UPDATE
- KUNCI
Ada, tentu saja, paralel yang kuat dengan database dan CONSTRANIS mereka. Namun, ada juga perbedaannya. Hibernate mencoba menyembunyikan pekerjaan sebenarnya dengan database sebanyak mungkin, jadi Hibernate Cascades ini persis tentang objek Entity.
6.2 Tipe Cascade
Parameter kaskade menjelaskan apa yang harus terjadi pada objek dependen jika kita mengubah induknya (objek master). Paling sering, parameter ini digunakan bersama dengan anotasi yang menjelaskan dependensi objek:
Contoh:
OneToOne(cascade = CascadeType.ALL)
Atau seperti ini:
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
Itu juga dapat ditulis sebagai anotasi terpisah:
@Cascade({ org.hibernate.annotations.CascadeType.ALL })
Sekarang mari kita bicara lebih banyak tentang arti anotasi ini.
6.3 SEMUA, TETAP, GABUNG
CascadeType.ALL
berarti semua tindakan yang kita lakukan dengan objek induk harus diulangi untuk objek dependennya.
CascadeType.PERSIST
artinya jika kita menyimpan objek induk ke database, maka hal yang sama harus dilakukan dengan objek dependennya. Contoh:
@Entity
@Table(name="employee")
class Employee {
@Column(name="id")
public Integer id;
@OneToOne(cascade = CascadeType.PERSIST, mappedBy="task")
private EmployeeTask task;
}
Contoh bekerja dengan kelas ini:
Employee director = new Employee();
EmployeeTask task = new EmployeeTask();
director.task = task;
session.persist(director);
session.flush();
Kami hanya menyimpan objek bertipe Employee, objek EmployeeTask yang bergantung padanya akan disimpan ke database secara otomatis.
CascadeType.MERGE
artinya jika kita memperbarui objek induk di database, maka hal yang sama harus dilakukan dengan objek dependennya.
6.4 HAPUS, HAPUS, LEPASKAN
CascadeType.REMOVE
artinya jika kita menghapus objek induk di database, maka hal yang sama harus dilakukan dengan objek dependennya.
CascadeType.DELETE
artinya sama. Ini adalah sinonim. Hanya dari spesifikasi yang berbeda.
CascadeType.DETACH
berarti jika kita menghapus objek induk dari sesi, maka hal yang sama harus dilakukan dengan objek dependennya. Contoh:
@Entity
@Table(name="employee")
class Employee {
@Column(name="id")
public Integer id;
@OneToOne(cascade = CascadeType.DETACH, mappedBy="task")
private EmployeeTask task;
}
Contoh bekerja dengan kelas ini:
Employee director = new Employee();
EmployeeTask task = new EmployeeTask();
director.task = task;
director.task = task;
session.flush();
assertThat(session.contains(director)).isTrue();
assertThat(session.contains(task)).isTrue();
session.detach(director);
assertThat(session.contains(director)).isFalse();
assertThat(session.contains(task)).isFalse();
CascadeType.REFRESH
dan CascadeType.SAVE_UPDATE
bekerja dengan cara yang sama seperti yang kita harapkan - mereka menduplikasi tindakan yang dilakukan dengan objek induk ke objek dependennya.
6.5 Opsi penghapusan anak yatim
Juga kadang-kadang Anda mungkin menemukan parameternya orphan
. Ini adalah kependekan dari penghapusan Orphan. Ini digunakan untuk memastikan bahwa tidak ada entitas anak tanpa entitas induk.
OneToOne(orphan = true)
Jika parameter ini disetel ke true, maka entitas anak akan dihapus jika sudah hilangsemua link. Itu tidak persis sama dengan Cascade.REMOVE
.
Anda mungkin mengalami situasi di mana beberapa entitas induk merujuk ke satu anak. Maka bermanfaat bahwa itu tidak dihapus bersamaan dengan penghapusan entitas induk, tetapi hanya jika semua referensi ke sana dihapuskan.
Katakanlah Anda memiliki kelas:
@Entity
@Table(name="user")
class Employee {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL, orphan = true)
@JoinColumn(name = "employee_id")
private Set<EmployeeTask> tasks = new HashSet<EmployeeTask>();
}
Employee director = session.find(Employee.class, 4);
EmployeeTask task = director.tasks.get(0);
director.tasks.remove(task)
session.persist(director);
session.flush();
Objek EmployeeTask akan dihapus karena tidak ada referensi yang tersisa. Pada saat yang sama, tidak ada yang menghapus objek induknya.
6.6 opsi pengambilan
Opsi pengambilan memungkinkan Anda untuk mengontrol bagaimana objek dependen dimuat. Biasanya dibutuhkan salah satu dari dua nilai:
FetchType.LAZY
FetchType.EAGER
Ini adalah topik yang sangat menarik dengan berbagai jebakan, jadi sebaiknya saya membicarakannya dalam kuliah terpisah.
GO TO FULL VERSION