Qual é a diferença entre
@OneToMany(cascade=REMOVE, mappedBy="customer")
public List<Order> getOrders() { ... }
e
@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }
Este exemplo é do Tutorial Java EE, mas ainda não entendo os detalhes.
java
jpa
cascading-deletes
rand0m86
fonte
fonte
Respostas:
A partir daqui : -
fonte
Uma maneira fácil de entender a diferença entre
CascadeType.REMOVE
eorphanRemoval=true
.Para remoção de órfãos: Se você chamar
setOrders(null)
, asOrder
entidades relacionadas serão removidas no banco de dados automaticamente.Para remover cascata: Se você chamar
setOrders(null)
, asOrder
entidades relacionadas NÃO serão removidas no banco de dados automaticamente.fonte
Suponha que temos uma entidade filha e uma entidade pai. Um pai pode ter vários filhos.
O órfão é um conceito ORM, ele diz se a criança é órfã. também deve ser removido do banco de dados.
Uma criança fica órfã quando não pode ser acessada por seus pais. Por exemplo, se removermos o conjunto de objetos Person (definindo-o como um conjunto vazio) ou substituí-lo por um novo conjunto, o pai não poderá mais acessar os filhos do conjunto antigo e os filhos ficarão órfãos, portanto os filhos estão condenados a ser removido no banco de dados também.
CascadeType.REMOVE é um conceito de nível de banco de dados e diz se o pai for removido, todos os seus registros relacionados na tabela filho devem ser removidos.
fonte
Praticamente a diferença está em se você está tentando atualizar os dados (PATCH) ou substituir totalmente os dados (PUT)
Digamos que você exclua o
customer
que usarcascade=REMOVE
também removerá os pedidos dos clientes que parecem intencionais e úteis.Agora, digamos que você atualize um
customer
comorphanRemoval="true"
ele excluirá todos os pedidos anteriores e os substituirá pelo fornecido. (PUT
em termos deREST API
)Sem as
orphanRemoval
velhas ordens seriam mantidas. (PATCH
em termos deREST API
)fonte
CascadeType.REMOVE
A
CascadeType.REMOVE
estratégia, que você pode configurar explicitamente:ou herde-o implicitamente da
CascadeType.ALL
estratégia:permite que você propague a
remove
operação da entidade pai para suas entidades filho.Portanto, se buscarmos a
Post
entidade pai junto com suacomments
coleção e removermos apost
entidade:O Hibernate irá executar três instruções de exclusão:
As
PostComment
entidades filhas foram excluídas por causa daCascadeType.REMOVE
estratégia, que atuou como se tivéssemos removido as entidades filhas também.A estratégia de remoção de órfãos
A estratégia de remoção de órfãos, que precisa ser definida por meio do
orphanRemoval
atributo:permite remover a linha da tabela filha ao remover a entidade filha da coleção.
Assim, se carregar a
Post
entidade junto com suacomments
coleção e remover o primeiroPostComment
dacomments
coleção:O Hibernate irá executar uma instrução DELETE para a
post_comment
linha da tabela associada :Para obter mais detalhes sobre este tópico, consulte também este artigo .
fonte