Oie pessoal tudo bem?
Estou com um probleminha que nao consigo resolver de jeito nenhum.
1 - Eu tenho uma lista (detalhe) dentro de um objeto (mestre) qualquer.
2 - Quando eu carrego o mestre na tela, a minha tabela referente ao detalhe nao carrega.
3 - Rodei em modo debug e constatei que realmente o meu list é vazio (size = 0).
Alguém sabe o que pode estar ocorrendo?
Observação: quando estou gravando, a minha lista é populada perfeitamente, fazendo com que ao persistir o mestre, o(s) detalhe(s) tambem sejam persistidos @Cascade;
Observação 2: Já testei fetch EAGER e LAZY mas nao deram certo.
posta as entidades com os relacionamentos e a consulta
J
Jessica_Lara
@lucciano01
O meu select é um findAll() mesmo, em que eu populo uma tabela que contem todas as vendas…
Classe Venda:
@EntitypublicclassVendaimplementsSerializable{@Id@Column(name="ID_VENDA",nullable=false)privateLongidVenda;// Varios atributos que nao tem relevancia neste caso ....@OneToMany(targetEntity=Produto.class,fetch=FetchType.EAGER,mappedBy="venda")// @OneToMany(targetEntity = Produto.class, fetch = FetchType.LAZY, mappedBy = "venda")@Cascade(org.hibernate.annotations.CascadeType.ALL)privateList<Produto>produtos;// getters and setters
Classe Produto:
@EntitypublicclassProdutoimplementsSerializable{@Id@Column(name="ID_PRODUTO")privateLongidProduto;// Varios atributos que nao tem relevancia neste caso ....@ManyToOne@JoinColumn(name="ID_VENDA")privateVendavenda;// getters and setters
lucciano01
`tenta isso:
select v from Venda v join fetch v.produtos as vp
`
J
Jessica_Lara
Mas o @Join ja nao deveria me garantir isto?
lucciano01
verdade, o join é feito "automaticamente" pelo relacionamento, mas vms tentar forçar a barra pra ver se traz algum resultado, porque até então seu mapeamento está correto
lucciano01
dá uma olhada tb se todos os seus imports estão vindo do pacote javax.persistence
J
Jessica_Lara
@lucciano01 eu identifiquei uma coisa.
Apesar de quando eu persisto a Venda os Produtos tambem estarem sendo persistidos, eles estao sem a referencia da Venda, ou seja, sem o idVenda informado. Entao o erro é na hora que estou salvando a Venda, sabe o que pode ser baseado nas minhas entidades e relacionamentos?
lucciano01
como estão os imports?
J
Jessica_Lara
Nada de anormal (nao acusa nenhum erro e persiste sem problemas)
A unica coisa que me chamou certa atencao foi ter que colocar o caminho explícito do CascadeType
Mesmo resultado!
Persiste a Venda e o(s) Produto(s) mas sem a referencia da venda no segundo (produtos)
To ficando doida ja kk
lucciano01
`cancela a implantação no servidor e manda limpar e construir o projeto novamente, se as tabelas não estiverem muito populadas o ideal seria apaga-las e veja se esta propriedade esta no persistence.xml
A property está ok tambem.
Nao sei o que pode estar ocorrendo
lucciano01
vc fez o undeploy da aplicação no servidor? aproveita e limpa o cache do navegador tb
J
Jessica_Lara
Ja sim! Nada resolvido.
Estava pesquisando em alguns foruns em ingles tambem e será que a forma com que eu estou persistindo os dados pode fazer alguma diferença neste caso? Por exemplo, se no salvar eu usar o persist() ao inves do merge()
lucciano01
a diferença entre o merge e o persist é que o merge verifica se a entidade já existe, caso não ele salva, do contrário ele atualiza
J
Jessica_Lara
Pois é acho que ja nao sei o que fazer e estou perdendo o foco do problema.
lucciano01
é assim mesmo, mas vai dar certo, programação tira a gente do sério as vezes
lucciano01
`retira o targetEntity da anotação
está sendo criada a tabela de relacionamenteo venda_produto?
`
J
Jessica_Lara
Nao tenho esta tabela derivada porque nao se trata de um N x N.
Mas deixa eu te passar o cenario e como as acoes estao se desenrolando…
Ambos estao sendo cadastrados no “mesmo momento” e talvez por isso esteja ficando com a referencia nula. Será que eu tenho que complementar com mais alguma anotacao tipo “antes de inserir os produtos…”
J
Jessica_Lara
So complementando minha resposta…
Eu entendi errado a sua pergunta ok?
Sao 3 tabelas … considere o que chamei anteriormente de Produto como “ProdutoVenda” , ou seja,
VENDA, PRODUTO e PRODUTOVENDA (1 venda para varios produtos)
E o relacionamento da Venda é com ProdutoVenda (este sim possui N produtos)
lucciano01
isso, pelo mapeamento devem ser criadas 3 tabelas. Deixa ver se eu compreendi. O produto não existe e o mesmo é cadastrado junto com a venda é isso?
J
Jessica_Lara
Perdao!!! Eu havia explicado de forma incorreta anteriormente, cabeça a mil ja hahaha
Os produtos existem (tabela produto)
1 - Quando vou inserir uma nova Venda, informo os dados necessarios dela - OK
2 - Ainda sem salvar a Venda, eu adiciono os produtos dela na tabela ProdutoVenda(idProduto, quantidade, precoUnit, totalProd)
Entende? O que quero dizer é que tanto a venda (tabela venda), quanto os produtos desta venda (tabela produtovenda) sao persistidos “juntos”.
lucciano01
ok, isso está correto, vc está fazendo essas operações pelo Main?
J
Jessica_Lara
Fiz tanto pelo main quanto pela app mesmo. Inclusive quando vinculo a venda via SQL no produtovenda a consulta passa a carregar minha lista perfeitamente. O problema esta sendo mesmo ao persistir
lucciano01
`não dá erro ao persistir ou recuperar?
`
J
Jessica_Lara
Nao da erro algum e salva tanto o mestre quanto o detalhe.
O unico problema mesmo é que os detalhes ficam sem a referencia do mestre.
J
Jessica_Lara
Acho que o problema ocorre porque quando faço o setProdutosVenda() a Venda ainda nao possui um ID.
Eu pensei que o mapeamento resolveria este tipo de problema ou entao falta eu complementar com alguma coisa
J
Jessica_Lara
RESOLVIDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
@lucciano01 muito obrigada pela atenção.
A única coisa que tive que fazer foi a cada produtovenda adicionado na tela chamar o setVenda(venda);
Parece algo meio obvio demais de se fazer, mas eu pensei que a anotation resolvia isso nos bastidores… parece que não né!!! Era isso obrigadaaa
rickfrocha
Olá. Penso que o objeto produto e venda estão com estado inconsciente. Para resolver este problema vc deve percorrer cada item de produto e setar a venda. Esse eh o caminho
rickfrocha
ah…demorei pra postar kkkk desculpa…e que bom que resolveu
lucciano01
`que bom Jessica, mas vc está certa a anotação era para resolver isso, quando vc a mapeou em produtos, que a cada operação de CRUD em venda isso se replicaria para produto era para automaticamente atualizar a tabela venda_produtos p. ex:
@rickfrocha bom dia kk obrigada tbm
Entao @lucciano01 nao entendi muito bem o pq ter que indicar o setVenda() sendo que os produtovendas estavam sendo persistidos a partir de uma venda (pra mim o hibernate tinha que se tocar a qual venda aqueles produtosvenda pertenciam hahah)