Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Quando usar CascadeType e qual a diferença entre ALL, PERSIST, MERGE, REMOVE, REFRESH, DETACH

Olá, estou fazendo o curso de JPA e ao aplicar os conhecimentos surgiu a seguinte duvida, supondo o seguinte cenário:

Considerando estes 2 objetos;

@Entity
class Cliente{
    ....
    @OneToMany
    List<Telefone> telefones;
}

@Entity
class Telefone{
    @ID 
    Long id;
    String numero;
    ...
}

O correto é na anotação @OneToMany colocar o CascadeType.PERSIST ou primeiro persistir o Telefone e depois o Cliente e adicionar na lista ? Qual a diferença entre todos estes tipos de CascadeType ?

1 resposta
solução!

Olá Jefferson, tudo bem? Peço desculpas pela demora no retorno! Primeiramente vamos entender o que faz cada um desses tipos de mapeamento:

  • PERSIST: Ele propaga a operação de persistir um objeto Pai para um objeto Filho, assim quando salvar a Entidade Cliente, também será salvo todas as Entidades Telefone associadas.

  • MERGE: Ele propaga a operação de atualização de um objeto Pai para um objeto Filho, assim quando atualizadas as informações da Entidade Cliente, também será atualizado no banco de dados todas as informações das Entidades Telefone associadas.

  • REMOVE: Ele propaga a operação de remoção de um objeto Pai para um objeto Filho, assim quando remover a Entidade Cliente, também será removida todas as entidades Telefone associadas.

  • REFRESH: Ele propaga a operação de recarregar de um objeto Pai para um objeto Filho, assim, quando houver atualização no banco de dados na Entidade Cliente, todas as entidades Telefone associadas serão recarregadas do banco de dados.

  • ALL: Corresponde a todas as operações acima (MERGE, PERSIST, REFRESH e REMOVE).

  • DETACH: "A operação de desanexação remove a entidade do contexto persistente. Quando usamos CascaseType.DETACH, a entidade filha também é removida do contexto persistente".

Fonte: https://www.baeldung.com/jpa-cascade-types

Sabendo o que cada CascaseType faz, acho que a melhor opção nesse seu exemplo é de fato o ALL, porque veja bem, é interessante persistir no banco de dados o cliente e os telefones desse cliente de uma vez, e também excluir da mesma forma, se o cliente for excluído os telefones do mesmo também devem ser excluídos, você até poderia usar apenas a opção REMOVE apenas, mas talvez isso não abranja todos os casos necessários. Então por isso acho que o ALL é mais indicado nesse caso.

Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software