Eu tenho um problema com um @OneToMany
mapeamento simples entre um pai e uma entidade filho. Tudo funciona bem, apenas os registros filho não são excluídos quando os removo da coleção.
O pai:
@Entity
public class Parent {
@Id
@Column(name = "ID")
private Long id;
@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
private Set<Child> childs = new HashSet<Child>();
...
}
A criança:
@Entity
public class Child {
@Id
@Column(name = "ID")
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="PARENTID", nullable = false)
private Parent parent;
...
}
Se agora eu excluir e filho do conjunto de filhos, ele não será excluído do banco de dados. Tentei anular a child.parent
referência, mas isso também não funcionou.
As entidades são usadas em um aplicativo Web, a exclusão acontece como parte de uma solicitação do Ajax. Não tenho uma lista de filhos excluídos quando o botão Salvar é pressionado, portanto não posso excluí-los implicitamente.
Além da resposta do cletus, o JPA 2.0 , final desde dezembro de 2010, introduz um
orphanRemoval
atributo nas@OneToMany
anotações. Para mais detalhes, consulte esta entrada do blog .Observe que, como a especificação é relativamente nova, nem todos os provedores de JPA 1 têm uma implementação final de JPA 2. Por exemplo, a versão do Hibernate 3.5.0-Beta-2 ainda não suporta esse atributo.
fonte
Você pode tentar isso:
@OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true)
.fonte
Como explicado, não é possível fazer o que eu quero com o JPA, então empreguei a anotação hibernate.cascade, com isso, o código relevante na classe Parent agora fica assim:
Eu não poderia usar simplesmente 'ALL', pois isso também excluiria o pai.
fonte
Aqui, em cascata, no contexto de remoção, significa que os filhos serão removidos se você remover o pai. Não é a associação. Se você estiver usando o Hibernate como seu provedor de JPA, poderá fazê-lo usando a cascata específica do hibernate .
fonte
Você pode tentar isso:
ou
fonte
Veja aqui .
fonte