Saya memiliki masalah dengan @OneToMany
pemetaan sederhana antara orang tua dan entitas anak. Semua berfungsi dengan baik, hanya saja catatan anak tidak dihapus ketika saya menghapusnya dari koleksi.
Orang tua:
@Entity
public class Parent {
@Id
@Column(name = "ID")
private Long id;
@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
private Set<Child> childs = new HashSet<Child>();
...
}
Anak:
@Entity
public class Child {
@Id
@Column(name = "ID")
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="PARENTID", nullable = false)
private Parent parent;
...
}
Jika sekarang saya menghapus dan child dari Set childs, itu tidak bisa dihapus dari database. Saya mencoba membatalkan child.parent
referensi, tetapi tidak berhasil.
Entitas digunakan dalam aplikasi web, penghapusan terjadi sebagai bagian dari permintaan Ajax. Saya tidak memiliki daftar anak yang dihapus ketika tombol simpan ditekan, jadi saya tidak bisa menghapusnya secara implisit.
Selain jawaban cletus, JPA 2.0 , final sejak Desember 2010, memperkenalkan
orphanRemoval
atribut pada@OneToMany
anotasi. Untuk lebih jelasnya lihat entri blog ini .Perhatikan bahwa karena spek ini relatif baru, tidak semua penyedia JPA 1 memiliki implementasi JPA 2 final. Misalnya, rilis Hibernate 3.5.0-Beta-2 belum mendukung atribut ini.
sumber
Anda dapat mencoba ini:
@OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true)
.sumber
Seperti yang dijelaskan, tidak mungkin untuk melakukan apa yang saya inginkan dengan JPA, jadi saya menggunakan anotasi hibernate.cascade, dengan ini, kode yang relevan di kelas Induk sekarang terlihat seperti ini:
Saya tidak bisa menggunakan 'SEMUA' karena ini akan menghapus induknya juga.
sumber
Di sini kaskade, dalam konteks penghapusan, berarti bahwa anak-anak dihapus jika Anda menghapus orang tua. Bukan asosiasi. Jika Anda menggunakan Hibernate sebagai penyedia JPA Anda, Anda dapat melakukannya menggunakan kaskade khusus hibernasi .
sumber
Anda dapat mencoba ini:
atau
sumber
Lihat di sini .
sumber