Acho que não entendi o significado de cascata no contexto de um @ManyToOne
relacionamento.
O caso:
public class User {
@OneToMany(fetch = FetchType.EAGER)
protected Set<Address> userAddresses;
}
public class Address {
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
protected User addressOwner;
}
Qual é o significado do cascade = CascadeType.ALL
? Por exemplo, se eu excluir um determinado endereço do banco de dados, como o fato de eu adicionar cascade = CascadeType.ALL
afetou meus dados ( User
eu acho)?
fonte
Veja aqui um exemplo dos documentos do OpenJPA.
CascadeType.ALL
significa que ele fará todas as ações.Citar:
Sebastian
fonte
Como expliquei neste artigo e em meu livro, Persistência Java de alto desempenho , você não deve usá
CascadeType.ALL
-lo,@ManyToOne
pois as transições de estado da entidade devem se propagar das entidades pai para as filho, e não o contrário.O
@ManyToOne
lado é sempre a associação filho, pois mapeia a coluna chave estrangeira subjacente.Portanto, você deve mover o
CascadeType.ALL
da@ManyToOne
associação para o@OneToMany
lado, que também deve usar omappedBy
atributo, pois é o mapeamento de relacionamento de tabela um para muitos mais eficiente .fonte
Na especificação EJB3.0 :
Portanto, em poucas palavras, os relacionamentos de entidade definidos com
CascadeType.All
garantirão que todos os eventos de persistência, como persistência, atualização, mesclagem e remoção que ocorrem no pai, sejam passados para o filho. Definir outrasCascadeType
opções fornece ao desenvolvedor um nível de controle mais granular sobre como a associação da entidade lida com a persistência.Por exemplo, se eu tivesse um objeto Livro que continha uma Lista de páginas e eu adicionasse um objeto de página dentro dessa lista. Se a
@OneToMany
anotação que define a associação entre Livro e Página for marcada comoCascadeType.All
, persistir o Livro resultaria na persistência da Página no banco de dados.fonte
No JPA 2.0, se você deseja excluir um endereço, se o removeu de uma entidade Usuário, você pode adicionar
orphanRemoval=true
(em vez deCascadeType.REMOVE
) ao seu@OneToMany
.Mais explicações entre
orphanRemoval=true
eCascadeType.REMOVE
está aqui .fonte
Se você deseja excluir o endereço atribuído ao usuário e não afetar a classe de entidade Usuário, tente algo como:
Dessa forma, você não precisa se preocupar em usar a busca em anotações. Mas lembre-se de que ao excluir o usuário, você também excluirá o endereço conectado ao objeto do usuário.
fonte