[ESCLARECIDO] - Dúvida JPA: 1-N e N-1  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
Bruno Lacerda
JavaEvangelist
[Avatar]

Membro desde: 16/07/2007 11:17:52
Mensagens: 371
Localização: Rio de Janeiro
Offline

Boa tarde pessoal!
Seguinte, em um mapeamento 1-N e N-1 eu crio um objeto X e atribuo a ele uma lista de novos objetos Y. neste momento nem X nem Y estão atachados. Ex:


Logo em seguida, ao tentar imprimir para cada Y o nome de X relacionado como abaixo,



está dando NPE. O que está errado?

Abaixo o mapeamento entre X e Y.






This message was edited 1 time. Last update was at 14/04/2009 08:06:17


A morte do homem começa no instante em que ele desiste de aprender.
fantomas
GUJ Master
[Avatar]

Membro desde: 24/04/2008 16:10:55
Mensagens: 1531
Localização: Terra (maior parte do tempo)
Offline

Experimenta executar um FLUSH na sessão, isso vai fazer com que a persistencia seja efetivada de fato. Inclusive deixe configurado para ele mostrar os sqls que estão sendo gerados para vc ver o que o ORM está fazendo.


flws
Bruno Lacerda
JavaEvangelist
[Avatar]

Membro desde: 16/07/2007 11:17:52
Mensagens: 371
Localização: Rio de Janeiro
Offline

Olá fantomas.
fazendo o que você falou continua dando NPE.
Não sei se adianta mas eu estou utilizando Spring (JpaTemplate).
No método save do meu DAO eu adicionei o flush mas ainda dá NPE.
Méu método:


Quando eu seto x a cada y antes de atribuir a lista de y a x funciona direito mas eu acho que não era para ser necessário fazer isto para funcionar.
Tipo:
para cada y eu atribuo x e depois seto a lista de y em x.

Entendeu???...


A morte do homem começa no instante em que ele desiste de aprender.
fantomas
GUJ Master
[Avatar]

Membro desde: 24/04/2008 16:10:55
Mensagens: 1531
Localização: Terra (maior parte do tempo)
Offline

Entendi...

A princípio também acho que deveria estar funcionando, como não vejo nada de muito óbvio no teu código...complicou. Mas mesmo assim vou dar dois chutes:

1) Você já deu uma olhada nos atributos da anotação @ManyToOne? Aqueles insertable, updatable etc....

2) No seu código vc apresentou o método x.setListaDeY( this.retornaUmaListaDeY() );, como é a implementação dele?
Se for igual a isto listaDeYs = variosYs; experimente trocar para uma implementação que adicione item a item (y a y) na lista. Isto porque a JPA / Hibernate troca o objeto do tipo lista para um tipo de lista dele dinamicamente ao gerar a instancia do objeto, talvez quando vc atribui diretamente uma instancia de outra lista que certamente não é do tipo que ele espera vc esteja "confundindo" os algoritimos dele. Faça um teste e analise com o debugger.

flws
Bruno Lacerda
JavaEvangelist
[Avatar]

Membro desde: 16/07/2007 11:17:52
Mensagens: 371
Localização: Rio de Janeiro
Offline

fantomas, acho que a implementação do retornaUmaListaDeY() já está do jeito que você sugeriu. Segue:


Agora se eu passar X e setar na lista de ys funciona. Segue:





A morte do homem começa no instante em que ele desiste de aprender.
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

vc não pode simplismente criar um Y, e adciona a lista de X .... vc tem que dizer a Y na relação de N-1 a referencia de X ...

sendo assim



o método setListaDeY teria que ser algo como



ou vc faz nesse ponto, ou faz no momento que vai crair X ....

eu particularmente não gosto de usar setListaDeY... eu uso métodos como

This message was edited 2 times. Last update was at 13/04/2009 17:03:42


Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
Bruno Lacerda
JavaEvangelist
[Avatar]

Membro desde: 16/07/2007 11:17:52
Mensagens: 371
Localização: Rio de Janeiro
Offline

Entendi Lavieri.
Então o que eue achava que não era o correto é o correto.
Para cada y eu tenho que setar x e depois setar para x cada y correspondente.

Obrigado pessoal!!!

A morte do homem começa no instante em que ele desiste de aprender.
 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team