Perubahan bertingkat

Tersedia

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.ALLberarti semua tindakan yang kita lakukan dengan objek induk harus diulangi untuk objek dependennya.

CascadeType.PERSISTartinya 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.MERGEartinya jika kita memperbarui objek induk di database, maka hal yang sama harus dilakukan dengan objek dependennya.

6.4 HAPUS, HAPUS, LEPASKAN

CascadeType.REMOVEartinya jika kita menghapus objek induk di database, maka hal yang sama harus dilakukan dengan objek dependennya.

CascadeType.DELETEartinya sama. Ini adalah sinonim. Hanya dari spesifikasi yang berbeda.

CascadeType.DETACHberarti 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.REFRESHdan CascadeType.SAVE_UPDATEbekerja 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.

Komentar
  • Populer
  • Baru
  • Lama
Anda harus login untuk memberikan komentar
Halaman ini belum memiliki komentar