Erro retorno de lista com @OneToMany mappedBy [RESOLVIDO]

15 respostas
jeroqueiroz

Prezados estou com os seguintes códigos:

Classe RequisicaoPagamento:

@OneToMany(mappedBy="requisicaoPagamento", cascade=CascadeType.ALL)
public List<ItensComprados> listItensComprados;

Classe ItensComprados:

@ManyToOne
public RequisicaoPagamento requisicaoPagamento;

Porém quando eu faço uma requisição de pagamento eu tenho vários Itens Comprados para uma requisição e ele enviar a lista normal no momento de Salvar a requisição de pagamento, porém quando eu tenho recuperar uma requisição de pagamento eu desejo que ele traga alem dos atributos da requisição traga a lista de items que foi passada no momento que foi realizada a requisição, porém a lista vem vazia.

Alguém pode ajudar? Desde já muito obrigado.

15 Respostas

Hebert_Coelho

Nenhum erro acontece? Como vc está trazendo essa lista?

fabiomedeirosf

Olá jeroqueiroz,

Fiz um post sobre esse mapeamento em meu blog, dê uma olhada, pode ser que te ajude: http://serjava.blogspot.com.br/2012/03/persistencia-jpa-onetomany-e-manytoone.html

[]s

Big_E

Deve ser por causa do FetchType.LAZY
Post sua consulta para darmos uma olhada.

Se estiver diferente, tente algo do tipo:

Query query = entityManager.createQuery("from RequisicaoPagamento rp join fetch rp.listItensComprados");
jeroqueiroz

Estou utilizando o Play! Framework e quando peço para buscar por ID ele traz todas as relações, porém neste caso ocorre o problema.

Mas posso determinar uma query para retornar, vou tentar com o exemplo de query postado abaixo.

Já retorno com um post sobre o resultado.

jeroqueiroz

Esta correta esta query?

Big_E

Entendi, uma outra sugestão (que não deveria estar aconselhando…rsrs) nesse caso é alterar o FetchType no seu mapeamento para EAGER, ficando da seguinte forma:

@OneToMany(mappedBy="requisicaoPagamento", cascade=CascadeType.ALL, fetch = FetchType.EAGER)  
    public List<ItensComprados> listItensComprados;

Isso não é aconselhando em nível de performance, pois os dados são buscados a todo momento.

Big_E

A query está correta sim.

jeroqueiroz

Usei a query exatamente como esta abaixo e não retorna nenhum item, na verdade até o objeto retorna null, pois antes retornava o objeto sem a lista, agora esta sem nada.

Hebert_Coelho

Cara, vc tem certeza que no banco tem os dados?

jeroqueiroz

Se eu mandar buscar somente pelo ID ele traz o registro e a lista sem nenhum item.

Será que pode esta ocorrendo algum erro no gravar?

Sendo q ele grava o registro.

jeroqueiroz

Quando eu crio este tipo de relacionamento ele deveria criar alguma tabela de relação no Banco?

Porque quando eu não utiliza o mappedBy ele criava uma tabela de relação entre os dois models, porém após este tipo de utilização ele não cria mais esta tabela.

Hebert_Coelho

Esse post explica todos os parâmetros desse relacionamento: @OneToMany e @ManyToOne Unidirecional e Bidirecional

Sem ofensa, leia pra você entender.

O mappedBy serve apenas para identificar quem irá ficar com a chave estrangeira.

jeroqueiroz

Obrigado jakefrog,

Muito obrigado pela indicação do post, muito bom mesmo e tranquilo, pois estou tendo duvida devido não esta muito acostumando a utilizar o mappedBy.

O post mim esclareceu muito e percebi que com o código que utilizo acima ele faz isto que diz no post:

Não o mappedBy, mas a forma que esta a anotação faz este tipo relação, não criando uma tabela, mas sim criando uma coluna nos ItensComprados com o seguinte atributo RequisicaoPagamento_ID, porém olhando percebo que elas estão como null.

Será que poderia mim dar mais alguma ajuda, se é algum erro no salvar o registro.

Quando salvo uma requisição de pagamento com uma lista de items ele deveria relacionar esta coluna já com o ID da requisição de pagamento, correto?

Desde já muito obrigado.

Hebert_Coelho

Se seu relacionamento for bidirecional vc ta fazendo a.setB(b) e b.setA(a) ?

jeroqueiroz

Obrigado a todos pela ajuda.

jakefrog seu post mim ajudou muito a resolver meu problema e entender de fato o funcionamento.

O erro estava que eu não estava salvando o registro, fazendo esta inserção após salvar o billingRequest, resolveu o problema.

for (int i = 0; i &lt; itemsPurchased.size(); i++) {
        	itemsPurchased.get(i).billingRequest = billingRequest;
        	itemsPurchased.get(i).billingRequest.save();
		}

Obrigado.

Criado 9 de maio de 2012
Ultima resposta 9 de mai. de 2012
Respostas 15
Participantes 4