O meu problema é o seguinte:
Como faço para quando eu deletar um time que possua várias pessoas essas pessoas também não sejam deletadas?
OBS: Ao deletar um time o atributo na classe pessoa que faz referencia ao time deve voltar a ser nulo… ?
Acho que não é necessário colocar uma anotação para isso, basta vc colocar no SQL do banco, na criação da tabela, na chave estrangeira de pessoas para times, por exemplo:
CONSTRAINT FK_PESSOAS_TIMES FOREIGN KEY(FK_TIME_ID) REFERENCES TIMES(ID) ON DELETE SET NULL
Quando o time for deletado, a chave estrangeira de Pessoas, FK_TIME_ID, será setada com null.
Testei aqui com JPA e EclipseLink, tranquilo.
Flw cara.
pedruhenrik
julianom,
mas com hibernate não seria mais prático utilizar a annotation e gerar o bd pela configuração do hibernate msm?
att,
gilvan.sfilho
Opa,…
o cascade = CascadeType.ALL vai deletar todo mundo, ou seja…
Quando eu deletar um time ira deletar as pessoas que fazem parte do time tambem.
O que eu quero é o seguinte:
Deletar o time e manter as pessoas cadastradas no banco,
porem o atributo time da classe pessoa deve voltar a ser nulo.
Abraços…
julianom
Olá pedruhenrik,
Concordo, não acho que vc está errado, mas eu vi um tópico em um fórum, parece o Hibernate não suporta o “ON DELETE SET NULL”…
Tem até uma anotação @OnDelete, assim:
Mas sem o SET NULL, e tipo… li os tipos de Cascades, na doc do Hibernate, mas não entendi como implementar isso…
Por isso, achei melhor adicionar isso no SQL…
flw véio.
julianom
Olá Gilvan,
Imagino que vc poderia fazer 2 coisas:
Se não tiver dados na tabela Pessoas, alterar a chave estrangeira (provavelmente teria que deletá-la) e reinseri-la com o ON DELETE NULL, em SQL…
Se vc pegar a lista de Pessoas de um Time, percorrê-la alterando cada Time de cada Pessoa para null, e deletar o Time depois, e a chave de Pessoas não pode ser not null, é claro. Pq como eu disse, acho que não é possível isso no Hibernate com annotations, conforme alguns tópicos de fóruns que li, e a documentação. Mas posso estar enganado…
DELETE_ORPHAN (alternatively, use the @OneToOne.orphanRemoval or @OneToMany.orphanRemoval flag)
nunca utilizei…será q ajuda?? heheh
é realmente se não tiver o “set null” acho q ñ adianta para o amigo ai…rsrs
se eu conseguir testar esse DELETE_ORPHAN posto o resultado aqui.
att,
julianom
Olá amigos,
Estava lendo a documentação do Hibernate, e na lista de tipos de cascades, estava mencionado como alternativa ao delete_orphan o atributo orphanRemoval. Experimente isso:
@OneToMany(orphanRemoval=false)
No caso, orphanRemoval, vc marca para remoção os órfãos (entidades associadas a outra entidade), ou não, em caso de deleção.
flws
julianom
mensagem duplicada removida.
julianom
Desculpem pela mensagem duplicada, pensei q o navegador não tivesse enviado… hehehe
Bom, acho que é isso aí… tenta aí Gilvan, e diz o que deu.
Abraço, véios.
pedruhenrik
aeee!!!
legal!!! ainda mais se funcionar ehheeh
boa sorte!
att,
gilvan.sfilho
Opa pessoal, valeu pelas dicas ai…
No momento estou longe do meu pc…
mas assim que der eu testo e posto resultado aqui
abraços…
C
Ca-Gol
Vou te dar uma dica para tudo que vc for fazer na vida:
simplifique.
VC ñ precisa saber o comando exato para a linguagem fazer tudo para vc.
Quando vc ñ souber um comando especifico pense, use logica. Por exemplo no seu caso:
vc cria um metodo para remover o time( nesta classe vc tem que criar um array de chaves primarias das pessoas que o utiizam).
O metodo para remover é:
public void removerTime( Time time){
Pessoa[] pessoal = time.getArrayDeChaves();
for(int i; pessoal.lenth > i; i++){
pessoal[i].setTime(null);
pessoaFacade.edit(pessoal[i];
}
timeFacade.remove(time);
}
espero te ajudado, flwss
pedruhenrik
e ae Ca-Gol, blz?
Excelente! a vida deveria ser assim.
mas, será q ñ compensa mais gastar um pouco de tempo em encontrar um método já pronto na linguagem/framework do q ficar ficar “reinventando a roda”? rs
att,
gilvan.sfilho
Ca-Gol:
Vou te dar uma dica para tudo que vc for fazer na vida:
simplifique.
VC ñ precisa saber o comando exato para a linguagem fazer tudo para vc.
Quando vc ñ souber um comando especifico pense, use logica. Por exemplo no seu caso:
vc cria um metodo para remover o time( nesta classe vc tem que criar um array de chaves primarias das pessoas que o utiizam).
O metodo para remover é:
Desculpe amigo, mas você foi infeliz com o seu comentário.
Estou tentando fazer exatamente o que você disse, SIMPLIFICAR…
Por isso o uso do framework, como o hibernante e o jsf, que são feitos exatamente para simplificar.
Eu descobrindo a solução para meu problema ao mesmo tempo estarei descobrindo a solução para futuros problemas que possam surgir, portanto não teria que ficar para cada um pensando numa maneira diferente de resolve-lo…
Abraços.
C
Ca-Gol
Se vc acha mais simples fazer isso faça, mas eu acho a logica o caminho mais facil e rapido pra tudo!