JPA - Comportamento Cascade.ALL OneToMany

Olá!

estou tentando entender o comportamento do Cascade.ALL em uma de minhas entidades. Estou lidando com menu, submenus e items de menu.

Minha entidade tem uma relação OneToMany com ela mesma, isto é, um item de menu pode ter uma coleção de outros itens de menu. Ao tentar excluir um item de menu que possuía uma coleção de outros itens, ocorria um erro no banco, devido à constraint da Foreign Key.

Anotei o relacionamento com Cascade.ALL e esse problema foi resolvido.

[code] @OneToMany(mappedBy=“subMenuPai”, fetch=FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval=true)
private Set itensFilhos

entityManager.remove(itemComSubitens); // OK!
[/code]

No entanto, após colocar o Cascade.ALL, não consigo mais excluir um dos subitens isoladamente. Ao executar o código abaixo não é feita a exclusão e nenhum erro é lançado.

Quando retiro o Cascade.ALL o segundo código acima funciona, mas o primeiro lança erro.

Qual seria a maneira correta de lidar com o Cascade nesse caso?

eu não uso cascade…
particularmente eu excluiria as coleções do item antes… depois excluiria o item em si…

[quote=alanrodrigues]eu não uso cascade…
particularmente eu excluiria as coleções do item antes… depois excluiria o item em si…[/quote]

Alan, mas aí você está deixando de usar uma funcionalidade muito útil da JPA. Alguma razão por não usar o Cascade?

Por enquanto eu tirei o Cascade.ALL e estou removendo a coleção de filhos antes de remover o pai. Porém gostaria de entender o comportamento que demonstrei. Alguém saberia esclarecer?

Abs!