Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Merge vs Cascade vs LAZY

Olá, Gostaria de saber se existe a possibilidade de cancelar um cascade de um merge caso o programador queira fazer isso. Algo como um evict.

Ex.: Classe Setor que possui uma lista de Pessoa com um CascadeType.MERGE. Ou seja, os merges que forem feitos no Setor serão propagados para Pessoa.

Num sistema web consulto os dados de Setor, exibindo na interface o nome do setor e as pessoas daquele setor. O usuário altera o nome do setor e manda salvar.

Sabemos que, caso a view tenha todos os dados e faça um bind com os dados do setor em um objeto do tipo Setor, ele teria que fazer uma nova consulta para inicializar a a lista de pessoas antes do update. Mas, quero evitar essa nova consulta (a collection é LAZY) à tabela Pessoa.

Perguntas:

  1. Então, caso o cascade seja propagado e a lista esteja vazia porque ainda não foi inicializado, removeríamos o vínculo entre o setor e as pessoas da lista?
  2. O cascade obriga o attach da lista de pessoas também, mesmo ela sendo lazy?
  3. Se a resposta à primeira pergunta for sim, como funcionaria a estratégia de merge para uma lista EAGER?
  4. Há algum método no EntityManager ou outra classe da JPA que permita cancelar o cascade de um merge em um caso de uso específico?
2 respostas
solução!

Olá Diogo,

O primeiro passo que você deve se perguntar, faz sentido ter esse Cascade.MERGE entre Setor e Pessoa? A sua primeira resposta rápida pode ser SIM, porém pense realmente no negócio... Sempre que você modificar o Setor quer que mude a lista de pessoas?

Sobre suas perguntas, respondendo a 4 e a 6 (já que pulou uns números vazios), o fetch type não tem nenhuma relação com o Cascade. Se a lista for EAGER ou LAZY o cascade funciona normal. Quem tem que se preocupar em carregar a lista é você, ou seja, na hora do UPDATE você tem que garantir que a sua lista possui os itens de que precisa. EAGER apenas facilitaria seu trabalho, o que não quer dizer que é o correto.

Com a resposta acima, creio que já respondi a 2 também, correto?

Sobre a 8, até onde sei não existe. Você precisa realmente saber se é esse relacionamento que você quer manter. Por isso fiz a primeira pergunta.

Espero ter ajudado de alguma forma.

Abraço

Perfeito, Paulo.

Obrigado.

A pergunta que mais importava era a 8, as outras foram pra desenvolver o raciocínio. O exemplo foi bem tosco mesmo, mas apenas pra colocar um cenário. :)

De fato, alguns desses problemas (devido ao exemplo) se resolverão no projeto. A minha curiosidade mesmo era saber se teria como anular um cascade em um caso específico. Talvez utilizando um interceptor, para esse caso de uso, mas se a api disponibilizasse algo já evitaria custo de programação. Sei que não é um caso que será usado sempre, mas quando estou estudando uma tecnologia, gosto de traçar paralelos e ver alguns casos específicos de arquiteturas nas quais já coloquei a mão.

Muito obrigado mais uma vez.

Abraço.