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.ALL
bermakna semua tindakan yang kita lakukan dengan objek induk mesti diulang untuk objek bergantungnya.
CascadeType.PERSIST
bermakna 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.MERGE
bermakna jika kita mengemas kini objek induk dalam pangkalan data, maka perkara yang sama mesti dilakukan dengan objek bergantungnya.
6.4 KELUARKAN, PADAM, PAPUSKAN
CascadeType.REMOVE
bermakna jika kita memadamkan objek induk dalam pangkalan data, maka perkara yang sama mesti dilakukan dengan objek bergantungnya.
CascadeType.DELETE
maksudnya sama. Ini adalah sinonim. Hanya dari spesifikasi yang berbeza.
CascadeType.DETACH
bermakna 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.REFRESH
dan CascadeType.SAVE_UPDATE
berfungsi 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.
GO TO FULL VERSION