1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Referencia do objeto continua sempre a mesma (EntityManager)

Meu sistema usa JBoss SEAM 2.2.x, "EJB3" e Hibernate/JPA, mas acredito que o problema que esteja ocorrendo seja abstrato à isso.

Tenho a seguinte iteração:

Dentro do Business:

    @In
    private EntityManager entityManager;

Dentro do Metodo:

for (int i = 1; i < (linhasArquivoRetorno.size() - 1); i++) {

            String linha = linhasArquivoRetorno.get(i);
            String numeroCartao = linha.substring(LayoutArquivoRetorno.POSICAO_INICIO_CARTAO, LayoutArquivoRetorno.POSICAO_FIM_CARTAO);
            String dataSolicitacao =
                    linha.substring(LayoutArquivoRetorno.POSICAO_INICIO_DATA_SOLICITACAO, LayoutArquivoRetorno.POSICAO_FIM_DATA_SOLICITACAO);
            String valorSaldo = linha.substring(LayoutArquivoRetorno.POSICAO_INICIO_VALOR_SALDO, LayoutArquivoRetorno.POSICAO_FIM_VALOR_SALDO);

            Double valorDouble = Double.valueOf(valorSaldo) / NUMERO_100;

            ConsultaAssistenciaEstudantil estudante = new ConsultaAssistenciaEstudantil();

            estudante = (ConsultaAssistenciaEstudantil) entityManager.createNamedQuery(
                            ConsultaAssistenciaEstudantil.CONSULTA_ASSISTENCIA_ESTUDANTIL_CARTAO_POR_NUMERO)
                                                                 .setParameter("numero", numeroCartao)
                                                                 .getSingleResult();

            TransferenciaCargaCreditoDTO saldoCartaoDTO = new TransferenciaCargaCreditoDTO();
            saldoCartaoDTO.setNumeroCartao(numeroCartao);
            saldoCartaoDTO.setDataSolicitacao(DateUtils.getDate(dataSolicitacao, "dd.MM.yyyy"));
            saldoCartaoDTO.setValorSaldo(valorDouble);
            saldoCartaoDTO.setIdMatricula(estudante.getIdMatricula());
            saldoCartaoDTO.setNomeAluno(estudante.getNomeEstudante());

            //            entityManager.clear(); // AQUI ESTÁ A DUVIDA!!!
            ConsultaAssistenciaEstudantil numeroCartaoNovo = new ConsultaAssistenciaEstudantil();
            numeroCartaoNovo = (ConsultaAssistenciaEstudantil) entityManager.createNamedQuery(
                            ConsultaAssistenciaEstudantil.CONSULTA_ASSISTENCIA_ESTUDANTIL_POR_MATRICULA_E_CARTAO_ATIVO)
                                                                 .setParameter("idMatricula", idMatricula)
                                                                 .getSingleResult();

            saldoCartaoDTO.setNumeroCartaoNovo(numeroCartaoNovo != null ? numeroCartaoNovo.getNumero() : "");

            listaSaldoCartao.add(saldoCartaoDTO);

        }

O problema que ocorre é o seguinte: A referencia do Objeto: estudante aponta para EXATAMENTE a mesma do Objeto: numeroCartaoNovo, mesmo as duas chamando HQLs diferentes e por consequencia o objeto(ConsultaAssistenciaEstudantil) que retorna é EXATAMENTE o mesmo(obviamente).

Eu simplesmente coloquei um entityManager.clear() ali e passou a funcionar, mas isso tem cheiro de Gambi pra mim... hehehehe.

E o mais importante pra mim é saber o porque isso ocorreu. Algum guru poderia me dar um Help?

Abraço e muito obrigado!

  • Se vc for usar o mesmo EntityManager sem dar um close(), a solução é usar esse clear mesmo pra limpar o buffer, senao pode aparecer algum select da vida desatualizado e vc ficar louco querendo saber o pq. Eu crio um EntityManager a cada transação, mas usando a mesma fábrica, assim posso dar um close() a cada final de transação, td isso faço por exemplo no JPAUtil. Bom, sei la se fui claro.

    Felipe Amaral   20 de mai de 2014
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags seam jpa hibernate reflections entity-framework ejb jboss sql ou faça a sua própria pergunta.