Objetos de Entidade de BD do JPA não atualiza, o que fazer?

Assim como está no código que eu postei, nem chego a usar essa session.
uso apenas EntityManagerFactory

Como você está usando EntityManagerFactory, acredito que você deveria usar:

EntityManager entityManager = entityManagerFactory.createEntityManager();

Esse entityManager deve ser o equivalante a “session” que falamos para sempre abrir e fechar a cada requisição do usuário.

JPA parece ser mais confuso ainda do que Hibernate puro. Vocês são guerreiros em usar.

1 curtida

Sim, EntityManager eu sempre uso e fecho em cada método do CRUD, alíás faço o netbeans gerar as classes do controlador JPA.
exemplo…

private List findFuncionarioEntities(boolean all, int maxResults, int firstResult) {
EntityManager em = getEntityManager();
try {
CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
cq.select(cq.from(Funcionario.class));
Query q = em.createQuery(cq);
if (!all) {
q.setMaxResults(maxResults);
q.setFirstResult(firstResult);
}
return q.getResultList();
} finally {
// em.flush();
em.close();
}
}

Ai realmente não sei o que pode ser. Com Hibernate puro não tinha esses problemas e podia inclusive trabalhar com Session sem cache.

O problema é que ele está alterando o BD pelo myadmin, ou seja, por fora do JPA e a ferramenta não foi feita pra funcionar dessa forma.

Sim, eu já concordei com isso. Tem que ficar reabrindo a conexão, pelo menos no Hibernate puro, já JPA parece que o buraco é mais enrolado ainda.

Na verdade a especificação JPA nem trata de cache.
Isso é um detalhe de implementação do provedor de persistência.

Não. A solução é parar de alterar o BD por fora do ORM, ou então parar de usar ORM.

Sim, mas na prática ele está tendo problema em ler de cache ao invés de banco.

Mas por hora o meu problema já está SOLUCIONADO. Resumindo o que eu queria era:

  1. clicar no botão “listar funcionários” e listar os dados deles numa tabela;
  2. limpar a tabela attravés de outro botão;
  3. alterar os dados por fora (pelo phpmyadmin, aliás isso pode ser necessário caso a aplicação funcione em rede);
  4. clicar NOVAMENTE no botão “listar funcionários” e listar os dados ALTERADOS;
    Antes não estava funcionando, mas agora depois que eu crio um EntityManagerFactory e fecho funciona, Obrigado pela ajuda javaflex e pfk66.

Seu problema está solucionado em ambiente de desenvolvimento com 1 usuário. Em produção com vários ao mesmo tempo e outra história.

ps: no caso, como se trata de uma aplicação desktop, 1 usuário é normal. É só a interface do usuário não deixar ele realizar várias operações que envolvem o banco ao mesmo tempo, ou vai travar a aplicação por estar criando vários factories.

Mas esse é o problema que ele quer resolver, senão ele nem teria criado esse post. Independente da má escolha da ferramenta, é o que ele quer.

JPA é uma má escolha?

Se você precisa ficar atualizando o BD pelo myadmin, sim. Por que você vai ter que saber como o mecanismo d cache funciona e recarregar as entidades, e isso é um detalhe de implementação do provedor de persistência, e não do JPA.

Se o seu projeto não é multibanco e você precisa dos dados sempre vindos online do banco, JDBC puro com SQL nativo é mais indicado, mais leve, mais sob controle. Se é multibanco e não precisa de cache, pelo menos com Hibernate puro tinha liberdade pra usar StatelessSession.

Ok, Acho que entendi.
Então imaginem o meu software java com JPA (desktop) funcionando em rede:
2 pc’s

  1. O pc A é clicado pra pra exibir todos os funcionarios do BD;
  2. O usuário do pc B edita os dados de um funcionário;
  3. O usuario do pc A clica pra exibir os funcionários novamente e já aparece os dados alterados pelo pc B.

Isso vai funcionar né?

Eu estou usando o phpmyadmin pra poder editar dados enquanto eu ainda não desenvolvi a parte que insere ou edita dados na minha aplicação.

“Mas esse é o problema que ele quer resolver, senão ele nem teria criado esse post. Independente da má escolha da ferramenta, é o que ele quer.”

Se ele ficar reabrindo a conexão vai ter outros problemas, então obviamente não pode ser a solução. E JPA não possui stateless session.

Não é a solução que eu e você gostaríamos, mas é para os casos que insistem em usar essas ferramentas mesmo nessas situações, e acontece bastante no mercado infelizmente. O nome da tecnologia é “Hibernar”! E JPA realmente limita mais, mas muitos preferem seguir padrões mesmo sem motivos reais. Felizmente Hibernate pra .NET está livre desse tipo de padrão.

Depende de como estiver implementado, como já foi explicado aqui sobre as saídas pra isso.

Não vai funcionar com JPA porque pc A e B possuem diferentes caches e um não tem como saber que o estado foi alterado pelo outro. Você vai ter que reiniciar a aplicação pra ver as alterações surtirem efeito.