1
resposta

conta.getMovimentacoes() = null

Ao criar uma Conta e Movimentacao no mesmo EntityManager retorna conta.getMovimentacoes() = null, mas grava no banco.

Como contornar esses casos?

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.com.caelum.financas.modelo.Conta;
import br.com.caelum.financas.modelo.Movimentacao;
import br.com.caelum.financas.modelo.TipoMovimentacao;
import br.com.caelum.financas.util.JPAUtil;

public class TesteTodasAsMovimentacoesDasContas {
    public static void main(String[] args) {

        EntityManager em = new JPAUtil().getEntityManager();
        em.getTransaction().begin();


        Conta conta1 = new Conta();
        conta1.setBanco("001 - BANCO DO BRASIL");
        conta1.setNumero("16987-8");
        conta1.setAgencia("6543");
        conta1.setTitular("teste quatro");
        em.persist(conta1);
        em.persist(conta1);

        Movimentacao movimentacao1 = new Movimentacao();
        movimentacao1.setData(Calendar.getInstance()); //hoje
        movimentacao1.setDescricao("teste 4");
        movimentacao1.setTipo(TipoMovimentacao.SAIDA);
        movimentacao1.setValor(new BigDecimal("100.0"));
        movimentacao1.setConta(conta1);

        em.persist(movimentacao1);
        em.getTransaction().commit();

        //String jpql = "select c from Conta c";//no relacionamento ...toMany temos o cenário Lazy, onde podemos resolver com join fetch

        String jpql = "select c from Conta c join fetch c.movimentacoes";

        Query query = em.createQuery(jpql);

        List<Conta> todasAsContas = query.getResultList();

        for (Conta conta : todasAsContas) {
            System.out.println("Titular: " + conta.getTitular());
            System.out.println("Movimentacoes: ");
            System.out.println(conta.getMovimentacoes());//teste do N+1

        }
    }

}
Titular: teste tres
Movimentacoes: 
[teste 3]
Titular: teste quatro
Movimentacoes: 
null
1 resposta

Oi Aline,

Talvez seja por conta do relacionamento ser bidirecional, e nesse caso ambos os lados do relacionamento devem ser setados:

 movimentacao1.setConta(conta1);
//Faltou essa linha:
conta1.getMovimentacoes().add(movimentacao1);

 em.persist(movimentacao1);
em.getTransaction().commit();

Veja se desse jeito resolve.