6.1 Pengurusan pergantungan yang mendalam

Dan beberapa perkara yang lebih berguna dan menarik tentang anotasi @OneToMany dan seumpamanya. Kesemuanya mempunyai 4 pilihan yang biasa digunakan:

  • lata = CascadeType.SEMUA
  • Pembuangan yatim = benar
  • ambil = FetchType.MALAS

Sekarang kita akan menganalisisnya dengan lebih terperinci. Dan kita akan mulakan dengan yang paling menarik - CascadeType . Parameter ini menentukan perkara yang harus berlaku kepada entiti bergantung jika kita menukar entiti utama.

Spesifikasi JPA mempunyai nilai berikut untuk parameter ini:

  • SEMUA
  • BERTAHAN
  • BERGABUNG
  • KELUARKAN
  • SEGARKAN
  • DETACH

Walau bagaimanapun, Hibernate mengembangkan spesifikasi ini kepada tiga lagi pilihan:

  • REPLICASI
  • SAVE_UPDATE
  • KUNCI

Sudah tentu, terdapat persamaan yang kuat dengan pangkalan data dan CONSTRANIS mereka. Walau bagaimanapun, terdapat juga perbezaan. Hibernate cuba menyembunyikan kerja sebenar dengan pangkalan data sebanyak mungkin, jadi Hibernate Cascades ini betul-betul mengenai objek Entiti.

6.2 Jenis Lata

Parameter lata menerangkan perkara yang harus berlaku kepada objek bergantung jika kita menukar induknya (objek induk). Selalunya, parameter ini digunakan bersama dengan anotasi yang menerangkan kebergantungan objek:

Contoh:

OneToOne(cascade = CascadeType.ALL)

Atau seperti ini:

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})

Ia juga boleh ditulis sebagai anotasi berasingan:

@Cascade({ org.hibernate.annotations.CascadeType.ALL })

Sekarang mari bercakap lebih lanjut tentang maksud anotasi ini.

6.3 SEMUA, BERTAHAN, BERGABUNG

CascadeType.ALLbermakna semua tindakan yang kita lakukan dengan objek induk mesti diulang untuk objek bergantungnya.

CascadeType.PERSISTbermakna jika kita menyimpan objek induk ke pangkalan data, maka perkara yang sama mesti dilakukan dengan objek bergantungnya. 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 jenis Pekerja, objek bergantungnya EmployeeTask akan disimpan ke pangkalan data secara automatik.

CascadeType.MERGEbermakna jika kita mengemas kini objek induk dalam pangkalan data, maka perkara yang sama mesti dilakukan dengan objek bergantungnya.

6.4 KELUARKAN, PADAM, PAPUSKAN

CascadeType.REMOVEbermakna jika kita memadamkan objek induk dalam pangkalan data, maka perkara yang sama mesti dilakukan dengan objek bergantungnya.

CascadeType.DELETEmaksudnya sama. Ini adalah sinonim. Hanya dari spesifikasi yang berbeza.

CascadeType.DETACHbermakna jika kita mengalih keluar objek induk daripada sesi, maka perkara yang sama mesti dilakukan dengan objek bergantungnya. 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_UPDATEberfungsi dengan cara yang sama seperti yang kita jangkakan - mereka menduplikasi tindakan yang dilakukan dengan objek induk kepada objek bergantungnya.

6.5 Pilihan penyingkiran anak yatim

Juga kadangkala anda mungkin menjumpai parameter orphan. Ini adalah singkatan untuk penyingkiran Anak Yatim. Ia digunakan untuk memastikan tiada entiti anak tanpa entiti induk.

OneToOne(orphan = true)

Jika parameter ini ditetapkan kepada benar, maka entiti anak akan dipadamkan jika ia telah hilangsemua pautan. Ia tidak sama dengan Cascade.REMOVE.

Anda mungkin mengalami situasi di mana beberapa entiti induk merujuk kepada seorang anak. Maka adalah berfaedah bahawa ia tidak dipadamkan bersama-sama dengan pemadaman entiti induk, tetapi hanya jika semua rujukan kepadanya dibatalkan.

Katakan anda mempunyai 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 dipadamkan kerana tiada rujukan yang tinggal kepadanya. Pada masa yang sama, tiada siapa yang memadamkan objek induk.

6.6 pilihan ambil

Pilihan ambil membolehkan anda mengawal cara objek bergantung dimuatkan. Ia biasanya mengambil satu daripada dua nilai:

  • FetchType.LAZY
  • FetchType.EAGER

Ini adalah topik yang sangat menarik dengan pelbagai perangkap, jadi lebih baik saya membincangkannya dalam kuliah yang berasingan.