Saya pikir saya salah memahami arti cascading dalam konteks suatu @ManyToOne
hubungan.
Kasus:
public class User {
@OneToMany(fetch = FetchType.EAGER)
protected Set<Address> userAddresses;
}
public class Address {
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
protected User addressOwner;
}
Apa arti dari cascade = CascadeType.ALL
? Misalnya, jika saya menghapus alamat tertentu dari database, bagaimana fakta bahwa saya menambahkan cascade = CascadeType.ALL
memengaruhi data saya ( User
, saya kira)?
Lihat di sini untuk contoh dari dokumen OpenJPA.
CascadeType.ALL
berarti akan melakukan semua tindakan.Mengutip:
Sebastian
sumber
Seperti yang saya jelaskan di artikel ini dan dalam buku saya, High-Performance Java Persistence , Anda tidak harus menggunakan
CascadeType.ALL
pada@ManyToOne
sejak transisi entitas negara harus merambat dari entitas Induk untuk yang anak, bukan sebaliknya.The
@ManyToOne
sisi selalu asosiasi anak karena memetakan kolom kunci asing yang mendasari.Oleh karena itu, Anda harus memindahkan
CascadeType.ALL
dari@ManyToOne
asosiasi ke@OneToMany
samping, yang juga harus menggunakanmappedBy
atribut karena itu adalah pemetaan hubungan tabel satu-ke-banyak yang paling efisien .sumber
Dari Spesifikasi EJB3.0 :
Jadi singkatnya, hubungan entitas yang didefinisikan dengan
CascadeType.All
akan memastikan bahwa semua peristiwa kegigihan seperti bertahan, menyegarkan, menggabungkan dan menghapus yang terjadi pada orang tua, akan diteruskan ke anak. MenentukanCascadeType
opsi lain memberikan pengembang dengan tingkat kontrol yang lebih rinci tentang bagaimana asosiasi entitas menangani kegigihan.Sebagai contoh jika saya memiliki buku objek yang berisi daftar halaman dan saya menambahkan objek halaman dalam daftar ini. Jika
@OneToMany
anotasi yang mendefinisikan hubungan antara Buku dan Halaman ditandai sebagaiCascadeType.All
, mempertahankan Buku akan menyebabkan Halaman juga tetap ada di database.sumber
Di JPA 2.0 jika Anda ingin menghapus alamat jika Anda menghapusnya dari entitas Pengguna Anda dapat menambahkan
orphanRemoval=true
(bukanCascadeType.REMOVE
) ke Anda@OneToMany
.Penjelasan lebih lanjut antara
orphanRemoval=true
danCascadeType.REMOVE
ada di sini .sumber
Jika Anda hanya ingin menghapus alamat yang diberikan kepada pengguna dan tidak mempengaruhi kelas entitas Pengguna Anda harus mencoba sesuatu seperti itu:
Dengan cara ini Anda tidak perlu khawatir tentang menggunakan pengambilan dalam anotasi. Tapi ingat ketika menghapus Pengguna Anda juga akan menghapus alamat yang terhubung ke objek pengguna.
sumber