Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Atualizar List do Relacionamento Bidirecional

Gostaria de saber como é possível atualizar a lista do relacionamento bidirecional, sem que haja a necessidade ade abrir uma nova conexão EntityManager.

Por exemplo:


public class TesteList {

    public static void main(String[] args) {

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

        Query query = manager
                .createQuery("select c from Conta c join fetch c.movimentacoes where c.id = :pId");
        query.setParameter("pId", 1);
        Conta conta = (Conta) query.getSingleResult();
        System.out.println("1 QTDE Movimentações: " + conta.getMovimentacoes().size()); //QUANTIDADE DE MOVIMENTAÇÕES ANTES DA NOVA MOVIMENTAÇÃO

        Movimentacao novaMovimentacao = new Movimentacao();
        novaMovimentacao.setData(Calendar.getInstance());
        novaMovimentacao.setDescricao("Conta de luz - ABRIL/2012");
        novaMovimentacao.setValor(new BigDecimal("135"));
        novaMovimentacao.setTipoMovimentacao(TipoMovimentacao.SAIDA);
        novaMovimentacao.setConta(conta);
        manager.persist(novaMovimentacao);
        manager.getTransaction().commit();

        conta = new Conta();
        query = manager
                .createQuery("select c from Conta c join fetch c.movimentacoes where c.id = :pId");
        query.setParameter("pId", 1);
        conta = (Conta) query.getSingleResult();
        System.out.println("2 QTDE Movimentações: "+ conta.getMovimentacoes().size()); //QUANTIDADE DE MOVIMENTAÇÕES NÃO ATUALIZA
        manager.close();



    }

}

No segundo syso : a QUANTIDADE DE MOVIMENTAÇÕES NÃO ATUALIZA

System.out.println("2 QTDE Movimentações: "+ conta.getMovimentacoes().size());
4 respostas

Em vez de fazer um select com HQL, tenta usar o método "find" que vai te retornar uma entidade Managed; Isso deve resolver o problema.

Infelizmente já tinha tentado essa solução, mas o problema continua. O que eu consegui fazer foi atualizar o classe conta com:

manager.persist(novaMovimentacao);
manager.refresh(conta);

Mas essa solução é custosa. E se torna mais ainda se eu tiver uma lista de contas, ou seja, teria que atualiza a lista para que fosse atualizado em cada objeto conta a lista de movimentação.

Séria isso uma falha da JPA ?(http://pt.stackoverflow.com/questions/46612/fetch-dos-filhos-com-jpahibernate-n%C3%A3o-est%C3%A1-funcionando)

Ou falha na minha implementação?

Algum posicionamento?

solução!

Oi Jadir.

O problema ocorre porque, apesar de você estar fazendo uma nova query e já tendo comitado a transação anterior, mesmo assim, o objeto ainda está no entity manager.

Basta fazer um clear no EntityManager para que seu código funcione.

// ...
manager.persist(novaMovimentacao);
manager.getTransaction().commit();
// Adicione a linha abaixo!
manager.clear();

// ....

Veja se isso lhe ajuda. Abraço.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software