Apa perbedaannya
@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }
dan
@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }
Contoh ini dari Tutorial Java EE, tapi saya masih belum mengerti detailnya.
java
jpa
cascading-deletes
rand0m86
sumber
sumber
Jawaban:
Dari sini : -
sumber
Cara mudah untuk memahami perbedaan antara
CascadeType.REMOVE
danorphanRemoval=true
.Untuk penghapusan yatim piatu: Jika Anda memanggil
setOrders(null)
,Order
entitas terkait akan dihapus dalam db secara otomatis.Untuk menghapus kaskade: Jika Anda memanggil
setOrders(null)
,Order
entitas terkait TIDAK akan dihapus dalam db secara otomatis.sumber
Misalkan kita memiliki entitas anak dan entitas induk. Seorang orang tua dapat memiliki beberapa anak.
OrphanRemoval adalah konsep ORM, yang memberi tahu jika anak itu yatim piatu. itu juga harus dihapus dari database.
Seorang anak menjadi yatim piatu jika tidak dapat diakses dari induknya. Misalnya, jika kita menghapus set objek Person (menyetelnya ke set kosong) atau menggantinya dengan set baru maka orang tua tidak bisa lagi mengakses anak-anak di set lama dan anak-anak menjadi yatim piatu sehingga anak-anak ditakdirkan untuk menjadi dihapus dalam database juga.
CascadeType.REMOVE adalah konsep tingkat database dan memberitahu jika induk dihapus, semua catatan terkait di tabel anak harus dihapus.
sumber
Secara praktis perbedaannya terletak pada apakah Anda mencoba memperbarui data (PATCH) atau mengganti data sepenuhnya (PUT)
Katakanlah Anda menghapus
customer
than menggunakancascade=REMOVE
juga akan menghapus pesanan pelanggan yang tampaknya dimaksudkan dan berguna.Sekarang katakanlah Anda memperbarui a
customer
denganorphanRemoval="true"
itu akan menghapus semua pesanan sebelumnya dan menggantinya dengan yang disediakan. (PUT
dalam halREST API
)Tanpa
orphanRemoval
perintah lama akan disimpan. (PATCH
dalam halREST API
)sumber
CascadeType.REMOVE
The
CascadeType.REMOVE
strategi, yang Anda dapat mengkonfigurasi secara eksplisit:atau mewarisi secara implisit dari
CascadeType.ALL
strategi:memungkinkan Anda untuk menyebarkan
remove
operasi dari entitas induk ke entitas anaknya.Jadi, jika kita mengambil
Post
entitas induk besertacomments
koleksinya, dan menghapuspost
entitas tersebut:Hibernate akan menjalankan tiga pernyataan hapus:
Para
PostComment
entitas anak yang dihapus karenaCascadeType.REMOVE
strategi, yang bertindak seolah-olah kita dihapus entitas anak juga.Strategi pemindahan anak yatim piatu
Strategi penghapusan yatim piatu, yang perlu disetel melalui
orphanRemoval
atribut:memungkinkan Anda untuk menghapus baris tabel anak setelah menghapus entitas anak dari koleksi.
Jadi, jika kita memuat
Post
entitas bersama dengancomments
koleksinya dan menghapus yang pertamaPostComment
daricomments
koleksi:Hibernate akan menjalankan pernyataan DELETE untuk
post_comment
baris tabel terkait :Untuk detail lebih lanjut tentang topik ini, lihat artikel ini juga.
sumber