@OneToMany - Exclusão de filhos em cascata  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
Mickdark
Thread.start()

Membro desde: 17/11/2011 15:42:40
Mensagens: 41
Offline

Olá!!

Estou fazendo o mapeamento de uma lista de privilegios, 1 privilegio pode ter varios recurso, enquanto 1 recurso pode ter apenas 1 privilegio, quando eu passo da view para a aplicação ele grava no banco, mas quando eu altero ele faz o update da chave estrangeira para null e faz outro insert com os novos dados!!! Eu queria que ele excluisse do banco ao invés de gerar o update da chave estrangeira, dei uma olhada em dois posts feitos com o mesmo problema mais para a minha aplicaçao não resolveu!! Segue o código!!

Entity Recurso


Entity Privilegio







Thiago Rodrigues
HelloWorld

Membro desde: 16/06/2008 20:46:25
Mensagens: 10
Offline

Mickdark wrote:Olá!!

Estou fazendo o mapeamento de uma lista de privilegios, 1 privilegio pode ter varios recurso, enquanto 1 recurso pode ter apenas 1 privilegio, quando eu passo da view para a aplicação ele grava no banco, mas quando eu altero ele faz o update da chave estrangeira para null e faz outro insert com os novos dados!!! Eu queria que ele excluisse do banco ao invés de gerar o update da chave estrangeira, dei uma olhada em dois posts feitos com o mesmo problema mais para a minha aplicaçao não resolveu!! Segue o código!!

Entity Recurso


Entity Privilegio






Não sei se irá resolver seu problema mas tente tirar o cascade da entidade Recurso
Mickdark
Thread.start()

Membro desde: 17/11/2011 15:42:40
Mensagens: 41
Offline

Olá Thiago!

Tentei e não deu certo!! Tens mais alguma sugestão?

This message was edited 1 time. Last update was at 18/01/2012 11:29:47




Thiago Rodrigues
HelloWorld

Membro desde: 16/06/2008 20:46:25
Mensagens: 10
Offline

Está usando qual provider? Imagino que isso deve ser configurável, não? Utilizo o Hibernate e nunca passei por esse tipo de situação
Mickdark
Thread.start()

Membro desde: 17/11/2011 15:42:40
Mensagens: 41
Offline

Então eu estou utilizando o Hibernate 3.6.8, no entando eu dei uma olhada nas documentações e em alguns foruns e percebi que pra usar um save ou update no hibernate para ele persistir eu tenho que implementar o equals e o HashCode!! Eu implementei o equals, agora o HashCode eu não sei como funciona, por isso estava procurando, e lendo uns tutos para aprender como ele funciona e como implementar esse método!!



marciobarroso
Virtual Machine Man
[Avatar]

Membro desde: 13/05/2005 23:17:13
Mensagens: 508
Localização: Barueri / SP / BR
Offline

Se estiver utilizando o Eclipse, ele gera para você. Acho que o netbeans também deve ter algo parecido.

no eclipse, acesse o menu source e generate hashCode() and equals() ...

Segue um exemplo gerado no eclipse:

[Email] [WWW] [MSN]
Tchello
GUJ Master
[Avatar]

Membro desde: 07/06/2008 14:41:04
Mensagens: 1695
Offline

Ta usando hibernate?
Use a annotation no relacionamento:

Mickdark
Thread.start()

Membro desde: 17/11/2011 15:42:40
Mensagens: 41
Offline

marciobarroso wrote:Se estiver utilizando o Eclipse, ele gera para você. Acho que o netbeans também deve ter algo parecido.

no eclipse, acesse o menu source e generate hashCode() and equals() ...

Segue um exemplo gerado no eclipse:



Obrigado Marcio, mas quando eu gerei o código ele está dando uma exception do hibernate, "org.hibernate.LazyInitializationException"



Mickdark
Thread.start()

Membro desde: 17/11/2011 15:42:40
Mensagens: 41
Offline

Tchello wrote: Ta usando hibernate?
Use a annotation no relacionamento:


Sim sim, eu estou tentando desta maneira depois que me responderam a primeira vez, mas ainda nada, olha o código como está neste momento!!!




marciobarroso
Virtual Machine Man
[Avatar]

Membro desde: 13/05/2005 23:17:13
Mensagens: 508
Localização: Barueri / SP / BR
Offline

Você precisa utilizar o FetchType para dizer ao hibernate que sua coleção deve ser inteiramente carregada logo de cara. Se você não configura isso, o hibernate só leva uma referencia dos itens da lista, tendo posteriormente que carregá-los quando for necessário.

Ai, surgem outros problemas ... se você estiver enviando estes pojos para o jsp para renderização, você vai precisar implementar um filtro do tipo OpenSessionInView, para carregar a lista, ou então, carrega a lista antes de enviar para o jsp.

Boa sorte
[Email] [WWW] [MSN]
Mickdark
Thread.start()

Membro desde: 17/11/2011 15:42:40
Mensagens: 41
Offline

marciobarroso wrote:Você precisa utilizar o FetchType para dizer ao hibernate que sua coleção deve ser inteiramente carregada logo de cara. Se você não configura isso, o hibernate só leva uma referencia dos itens da lista, tendo posteriormente que carregá-los quando for necessário.

Ai, surgem outros problemas ... se você estiver enviando estes pojos para o jsp para renderização, você vai precisar implementar um filtro do tipo OpenSessionInView, para carregar a lista, ou então, carrega a lista antes de enviar para o jsp.

Boa sorte


É verdade, eu tinha esquecido de colocar o EAGER no fetch, bom, o problema, desse fetch foi resolvido de outra forma, quando o eclipse implementou o HashCode ele colocou a igualdade para todos os campos, mas no meu caso eu queria apenas do nome do privilegio e da empresa, então eu comentei os outros dois campos, e esse erro do FetchTypeLazyException não apareceu mais, agora vou testar se arrumando o HashCode da outra tabela ele exclui os valores depois de atualizar XD!!!

Como o Eclipse Implementou


Como eu arrumei



Mickdark
Thread.start()

Membro desde: 17/11/2011 15:42:40
Mensagens: 41
Offline

Finalmente eu consegui XD!!!!

Eu mudei alguns mapeamentos e mudei algumas coisas no equals e hashCode, no final das contas tenho quase certeza de que o problema estava realmente no mapeamento da entidade colocando Merge e alterando por merge também e não mais por saveOrUpdate, bom pra quem estiver passando por este problema segue meu código completo!! Ha esqueci de dizer, eu estou usando o VRaptor como MVC, por isso algumas annotations que não fazem parte da JPA, como @Component !!

Explicação: Tabela de Privilegios, 1 privilegio pode ter 0 ou mais recursos (OneToMany), e cada recurso tem que ter pelo menos 1 privilegio (ManyToOne)




Código que faz o merge de acordo com a requisição na JSP!!


Metodo criado no privilegioDao!!


Eu fiz uma classe que guarda todas as consultas padrões, só não sei se é uma boa idéia, mas ta ai!!


Agora só preciso ver o de exclusão em cascata !!!






Mickdark
Thread.start()

Membro desde: 17/11/2011 15:42:40
Mensagens: 41
Offline

O cascateamento utilizando Delete não funcionou de jeito nenhum, gostaria de saber se alguem ja tentou fazer um delete em um objeto desanexado apenas com o id?

Eu fiz um teste com JUnit, assim!!



Mickdark
Thread.start()

Membro desde: 17/11/2011 15:42:40
Mensagens: 41
Offline

A unica maneira de fazer com que ele realizasse a exclusão em cascata, "Alem de ter o @Cascade(value={CascateType.DELETE}", foi chamando um refresh antes de excluir o objeto só com o id setado!!

Alguem sabe me dizer se desta maneira está correta?




 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team