Lista não carrega (HIBERNATE) [RESOLVIDO]

33 respostas
J

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.

33 Respostas

lucciano01

posta as entidades com os relacionamentos e a consulta

J

@lucciano01
O meu select é um findAll() mesmo, em que eu populo uma tabela que contem todas as vendas…

Classe Venda:

@Entity
public class Venda implements Serializable {

    @Id
    @Column(name = "ID_VENDA", nullable = false)
    private Long idVenda;
    // 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)
    private List<Produto> produtos;
    // getters and setters

Classe Produto:

@Entity
public class Produto implements Serializable {

    @Id
    @Column(name = "ID_PRODUTO")
    private Long idProduto;
    // Varios atributos que nao tem relevancia neste caso ....
    @ManyToOne
    @JoinColumn(name = "ID_VENDA")
    private Venda venda;
   // getters and setters
lucciano01

`tenta isso:

select v from Venda v join fetch v.produtos as vp
`

J

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

@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

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

@Cascade(org.hibernate.annotations.CascadeType.ALL)

lucciano01

`tenta isso:

import javax.persistence.CascadeType;

@OneToMany(targetEntity = Produto.class, fetch = FetchType.EAGER, mappedBy = venda, cascade = CascadeType.ALL)

private List< Produto> produtos;

`
J

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

< property name=“hibernate.hbm2ddl.auto” value=“update”/>
`

J

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

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

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

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…

1 - O usuario informa os dados requeridos da Venda;

2 - Ainda sem persistir a Venda, ele adiciona os Produtos daquela venda;

3 - Quando clica em salvar, os produtos sao adicionados à venda atraves do setProdutos(List p) e SOMENTE a venda é persistida (embora as anotacoes me garantam tambem a persistencia do produtos)

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

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

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

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

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

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

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:

tabela venda_produtos

id_venda | id_produto
1 ------------- 1
1 ------------- 2
1 ------------- 5

`

J

@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)

Criado 26 de março de 2016
Ultima resposta 27 de mar. de 2016
Respostas 33
Participantes 3