segunda-feira, 22 de setembro de 2014

CascadeType.

O CascadeType é uma maneira de definir a forma como serão propagadas as operações em cascata de uma Entity para suas referencias. A vantagem do Cascade é a propagação automaticamente da ação configurada nos relacionamentos da entidade.
As definições do Cascade são passadas dentro das anotações @OneToOne, @OneToMany e @ManyToMany, e as possibilidades de valores para o Cascade podem ser encontradas dentro de um enum javax.persistence.CascadeType.

Tipos:
  • CascadeType.PERSIST– disparado toda vez que uma nova entity for inserida no banco de dados pelo comando entityManager.persist();
  • CascadeType.DETACH – disparado toda vez que uma entity é retirada do Persistence Context. Comandos que podem disparar essa ação: entityManager.detach(), entityManager.clear(). Ocorrerá um detach também quando o Persistence Context deixar de existir;
  • CascadeType.MERGE – disparado toda vez que uma alteração é executada em uma entity. Essa alteração pode acontecer ao final de uma transação com a qual uma managed Entity foi alterada (4.2), ou pelo comando entityManager.merge();
  • CascadeType.REFRESH – disparada quando uma entity for atualizada com informações no banco de dados. Comando: entityManager.refresh();
  • CascadeType.REMOVE – disparado quando uma entity é removida (apagada) do banco de dados, os relacionamentos marcados também serão eliminados O comando utilizado é o entityManager.remove();
  • CascadeType.ALL – todos os eventos anteriores serão sempre refletidos nas Entities relacionadas.


Exemplo para setar apenas um tipo de Cascade:

@OneToMany(cascade = CascadeType.ALL)
private List
usuarios;

Exemplo para setar um ou mais tipos, (porém não todos):

@OneToMany(cascade ={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE })
private List usuarios;



Observações sobre o Cascade:

  • É preciso ter bastante cuidado ao anotar um relacionamento com CascadeType.ALL. Uma vez que se a entidade fosse removida o seu relacionamento também seria removido do banco de dados.
  • CascadeType.ALL (ou opções únicas) pode causar lentidão em todas as ações realizadas na entidade. Caso a entidade tenha muitas listas um merge() poderia causar todas as listas a receberem merge().

2 comentários:

  1. Se eu deixar sem ele fica default, ou seja, sem essas operações?

    ResponderExcluir
    Respostas
    1. Se não colocar não vai acontecer nenhuma dessas operaçoes

      Excluir