Veja neste artigo os diversos tipos de cascade que podem ser utilizados no Hibernate.
Artigos Java Cascade Hibernate: Conhecendo diferentes tipos
Neste artigo iremos demonstrar os vários tipos de cascade que o Hibernate nos oferece afim de facilitar as operações de persistência no banco. O cascade não é um recurso específico do Hibernate, este já vem de longa data e é um conceito sólido em se tratando de banco de dados.
Como o próprio nome já diz, a função do cascade é cascatear operações de persistência. Com isso você já deve perceber que este é utilizada apenas quando existe algum tipo de relacionamento entre 2 ou mais classes.
Cascade save-update
Vamos iniciar pelo cascade save-update. E como o nome sugere, quando é feito um save ou um update na classe "Pai" as classes "Filhas" também são salvas ou atualizadas. Veja na listagem 1 como ficaria um cascade sem save-update.
Listagem 1: Cascade sem save-update
O que você percebe acima ? Temos que salvar o Stock e depois salvar o StockDailyRecords, ou seja, temos que explicitamente salvar a classe "Filha". Veja abaixo a saída do código acima no Hibernate.
Listagem 2: Saida da Listagem 1
insert into stock (STOCK_CODE, STOCK_NAME)
insert into stock_daily_record
Agora vamos utilizar o save-update e ver o resultado do mesmo.
Listagem 3: Mapeando com cascade save-update
<one-to-many class="br.com.myproject.StockDailyRecord" />
Perceba acima que estamos salvando apenas o Stock e tudo será cascateado na classe Filha, veja a saída do código abaixo.
Listagem 4: Saída da Listagem 3.
O código da listagem 4 é apenas para demonstrar que a saída será a mesma independente de usar ou não o cascade. Porém para um desenvolvimento baseado nas boas práticas é aconselhável o uso do mesmo.
O cascade delete faz com que os filhos sejam deletados se o pai for deletado, é a mesma lógica de Nota fisca e ItemNotafiscal, ou seja, se deletarmos a Nota fiscal os itens devem ser deletados. Veja como ficaria se não utilizarmos o cascade delete.
Listagem 5: Sem cascade delete
q.setParameter("stockCode", "123");
Tivemos que fazer um laço para deletar item por item do Stock. Poderíamos resolver isso apenas adicionando o cascade delete.
Listagem 6: Usando cascade delete
Perceba que não precisamos mais do laço, já que utilizamos o cascade delete.
Existe ainda o delete-orphan, quando você salva ou atualiza a classe pai, os registros filhos que estavam marcados como removidos são de fato deletados. Vamos pegar o exemplo da classe Stock e StockDailyRecord. Se você estiver gerenciando um objeto Stock que possui vários itens StockDailyRecord, freqüentemente você pode querer deletar 1 ou mais StockDailyRecord e salvar pelo Stock, através do delete-orphan isso é possível. Vamos ver exemplos nas listagens abaixo.
Listagem 7: Sem cascade delete-orphan
Perceba acima que você terá que explicitamente dizer qual item você quer deletar, isso na hora do desenvolvimento pode "pesar" muito já que você terá que gravar os ID de cada item que deverá ser deletado posteriormente. Veja como nosso exemplo fica muito mais fácil com o cascade delete-orphan.
Listagem 8: Usando cascade delete-orphan
Nos tipos de Cascade vistos neste artigo utilizamos o mapeamento em XML, porém nada impede que você os use via anotações.
Listagem 9: Usando cascade por anotações
Com certeza este é um assunto muito importante e essencial para o desenvolvimento de projetos usando Hibernate.