Mam problem z prostym @OneToMany
mapowaniem między jednostką nadrzędną i podrzędną. Wszystko działa dobrze, tylko że rekordy podrzędne nie są usuwane, gdy usuwam je z kolekcji.
Rodzic:
@Entity
public class Parent {
@Id
@Column(name = "ID")
private Long id;
@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
private Set<Child> childs = new HashSet<Child>();
...
}
Dziecko:
@Entity
public class Child {
@Id
@Column(name = "ID")
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="PARENTID", nullable = false)
private Parent parent;
...
}
Jeśli teraz usunę i dziecko z zestawu childs, nie zostanie ono usunięte z bazy danych. Próbowałem anulować child.parent
odniesienie, ale to też nie zadziałało.
Encje są używane w aplikacji internetowej, usuwanie odbywa się jako część żądania Ajax. Nie mam listy usuniętych dzieci po naciśnięciu przycisku zapisywania, więc nie mogę ich niejawnie usunąć.
Oprócz odpowiedzi Cletusa, JPA 2.0 , obowiązujące od grudnia 2010 r., Wprowadza
orphanRemoval
atrybut do@OneToMany
adnotacji. Aby uzyskać więcej informacji, zobacz ten wpis na blogu .Zauważ, że ponieważ specyfikacja jest stosunkowo nowa, nie wszyscy dostawcy JPA 1 mają ostateczną implementację JPA 2. Na przykład wersja Hibernate 3.5.0-Beta-2 nie obsługuje jeszcze tego atrybutu.
źródło
Możesz spróbować tego:
@OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true)
.źródło
Jak wyjaśniono, nie jest możliwe zrobienie tego, co chcę z JPA, więc zastosowałem adnotację hibernate.cascade, w której odpowiedni kod w klasie Parent wygląda teraz następująco:
Nie mogłem po prostu użyć „WSZYSTKIE”, ponieważ spowodowałoby to również usunięcie rodzica.
źródło
Tutaj kaskada, w kontekście usuwania, oznacza, że dzieci są usuwane, jeśli usuniesz rodzica. Nie stowarzyszenie. Jeśli używasz Hibernacji jako dostawcy JPA, możesz to zrobić za pomocą specyficznej kaskady hibernacji .
źródło
Możesz spróbować tego:
lub
źródło
Zobacz tutaj .
źródło