Katakanlah saya memiliki hubungan searah @ManyToOne
seperti berikut:
@Entity
public class Parent implements Serializable {
@Id
@GeneratedValue
private long id;
}
@Entity
public class Child implements Serializable {
@Id
@GeneratedValue
private long id;
@ManyToOne
@JoinColumn
private Parent parent;
}
Jika saya memiliki orang tua P dan anak C 1 ... C n mereferensikan kembali ke P, apakah ada cara yang bersih dan cantik di JPA untuk secara otomatis menghapus anak C 1 ... C n saat P dihapus (yaitu entityManager.remove(P)
)?
Yang saya cari adalah fungsi yang mirip dengan ON DELETE CASCADE
SQL.
java
jpa
jpa-2.0
many-to-one
pelaku
sumber
sumber
Jawaban:
Hubungan di JPA selalu searah, kecuali jika Anda mengaitkan induk dengan anaknya di kedua arah. Operasi Cascading REMOVE dari induk ke anak akan membutuhkan relasi dari induk ke anak (bukan hanya sebaliknya).
Oleh karena itu, Anda harus melakukan ini:
@ManyToOne
hubungan searah menjadi dua arah@ManyToOne
, atau searah@OneToMany
. Anda kemudian dapat melakukan operasi Cascade REMOVE sehinggaEntityManager.remove
akan menghapus induk dan anak. Anda juga dapat menetapkanorphanRemoval
sebagai benar, untuk menghapus anak yatim piatu saat entitas anak dalam koleksi induk disetel ke nol, yaitu menghapus anak jika tidak ada dalam koleksi induk mana pun.ON DELETE CASCADE
. Anda harus memanggilEntityManager.clear()
setelah memanggilEntityManager.remove(parent)
karena konteks persistensi perlu di-refresh - entitas turunan tidak seharusnya ada dalam konteks persistensi setelah dihapus dalam database.sumber
Jika Anda menggunakan hibernasi sebagai penyedia JPA, Anda dapat menggunakan anotasi @OnDelete. Anotasi ini akan menambah relasi pemicu ON DELETE CASCADE , yang mendelegasikan penghapusan anak ke database.
Contoh:
Dengan solusi ini, hubungan searah dari anak ke induk sudah cukup untuk secara otomatis menghapus semua anak. Solusi ini tidak membutuhkan pendengar, dll. Juga kueri seperti DELETE FROM Parent WHERE id = 1 akan menghapus anak-anak.
sumber
@OneToOne
Ada ide bagaimana mengatasinya@OneToOne
?Buat hubungan dua arah, seperti ini:
sumber
Saya telah melihat di @ManytoOne searah, hapus tidak berfungsi seperti yang diharapkan. Ketika orang tua dihapus, idealnya anak juga harus dihapus, tetapi hanya orang tua yang dihapus dan anak TIDAK dihapus dan dibiarkan sebagai yatim piatu
Teknologi yang digunakan adalah Spring Boot / Spring Data JPA / Hibernate
Sprint Boot: 2.1.2. LEPAS
Spring Data JPA / Hibernate digunakan untuk menghapus baris .eg
parentRepository.delete(parent)
ParentRepository memperluas repositori CRUD standar seperti yang ditunjukkan di bawah ini
ParentRepository extends CrudRepository<T, ID>
Berikut adalah kelas entitas saya
sumber
spring.jpa.hibernate.use-new-id-generator-mappings=true spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
"
dalam kode. Lihatname= "parent"
Gunakan cara ini untuk menghapus hanya satu sisi
sumber
@Cascade (org.hibate.annotations.CascadeType.DELETEORPHAN)
Anotasi yang diberikan berhasil untuk saya. Bisa dicoba
Sebagai contoh :-
sumber