Erro retorno de lista com @OneToMany mappedBy [RESOLVIDO]

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.

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

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

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");

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.

Esta correta esta query?

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.

A query está correta sim.

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.

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

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.

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.

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.

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.

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

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.