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

Serve pra você trabalhar com objetos Java, sem ter que manipular tabelas diretamente no phpmyadmin, e no contexto onde o banco de dados é acessado por apenas uma aplicação (monolitico).

Se você quer compartilhar os dados com várias aplicações, o melhor seria expor o banco como um serviço em vez de objetos.

@AndreSI Você já tentou usar o EntityManager como falei acima?

Segue um exemplo mais completo:

EntityManager em = seuEntityManagerFactory.createEntityManager();
try {
    Query query = em.createQuery("from Cliente");
    return query.getResultList();
}
finally {
    em.close();
}

@javaflex o meu problema já foi SOLUCIONADO lá em cima com o código abaixo e nas minhas classes DAO já utilizo códigos como esse que vc postou. Enfim consegui que o JPA me trouxesse objetos atualizados a partir do BD, abrindo e fechando o EntityManagerFactory conforme o código abaixo.

public class PainelListaDeFuncionarios extends javax.swing.JPanel implements ActionListener{
private final DefaultTableModel modelo1;
private final JanelaPrincipal janelaPai;

List funcionarios = null;
EntityManagerFactory fctr;

public PainelListaDeFuncionarios(JFrame janelaPai) {
this.janelaPai = (JanelaPrincipal) janelaPai;
initComponents();
modelo1 = (DefaultTableModel) tabelaFuncs.getModel();

fctr = Persistence.createEntityManagerFactory(“com.sigef_jar_1.0-SNAPSHOTPU”);
FuncionarioJpaController fJpaC =
new FuncionarioJpaController(fctr);

funcionarios = fJpaC.findFuncionarioEntities();

int numRow = modelo1.getRowCount();
Object[] line;
Funcionario funcion;

for (int idx = 0; idx < funcionarios.size(); idx++) {
funcion = funcionarios.get(idx);

line = new Object[]{
funcion.getPessoa().getPessoaPK().getId(),
funcion.getPessoa().getNome(),
funcion.getCargo().getNome(),
funcion.getPessoa().getNascimentoData()
};
modelo1.addRow(line);
}

//IMPORTANTE PARA FECHAR AS CONEXÕES DO BD
fctr.close();

}
}

cada vez que esse JPanel é instanciado na minha janela principal quando clico no botão ele cria o EntityManagerFactory e puxa os dados novos do BD.

Se desabilitar o cache do hibernate, vai ter problema de performance porque cada join no SQL é uma viagem ao banco. Agora o desenvolver da aplicação tem que ser DBA e se preocupar em gerar queries otimizadas…

Enfim, a essa altura os benefícios do ORM já foram por água a baixo.

Não sou defensor de Hibernate/JPA, mas é possível fazer joins e gerar um único SQL.

É possível pra quem? desenvolvedores? DBAs?

Acredito que isso não seja boa prática.

Como assim? a que estás se referindo?
é dessa forma que nos recomendam, veja:
caelum.com.br/apostila-java-web/uma-introducao-pratica-ao-jpa-com-hibernate/

É possível fazer joins com Hibernate e ele executar um único SQL e não sempre um para cada join, fica a cargo do desenvolvedor.

EntityManagerFactory carrega as configurações mapeadas, imagina ficar toda hora carregando configurações? Se considera isso boa prática então tudo bem.

Veja bem nessa linha, ele cria o EntityManager como tinha te falado:

EntityManager manager = factory.createEntityManager();

Olá,

Sabem que o Weld que é a implementação do CDI, permite usar CDI com Java SE ?

Vejam: http://stackoverflow.com/questions/20935977/what-is-the-easiest-way-to-have-cdi-and-jpa-in-java-se e https://docs.jboss.org/weld/reference/latest/en-US/html/environments.html#_java_se
"
When executing in the SE environment the following features of Weld are available:

  • Managed beans with @PostConstruct and @PreDestroy lifecycle callbacks
  • Dependency injection with qualifiers and alternatives
  • @Application, @Dependent and @Singleton scopes
  • Interceptors and decorators
  • Stereotypes
  • Events
  • Portable extension support
    "

Assim usa aplicação Java SE pode ficar mais robusta ! :wink:

Mas eu crio e uso o EntityManager ele está imbutido no método findFuncionarioEntities() daqui:

FuncionarioJpaController fJpaC = new FuncionarioJpaController(fctr);
funcionarios = fJpaC.findFuncionarioEntities();

parece que vcs ainda não usaram o netbeans pra gerar classes de entidade e classes controladoras com JPA.

Vou continuar meu projeto depois eu volto aki.

Netbeans? Não mesmo. Fazia tudo na mão pra saber o que estou fazendo.

ou eclipse. o eclipese tbm faz.
agente Começa fazendo à mao mesmo, porém depois que entendenmos, devemos usar essas ferramentas pra agilizar. principlamente se o projeto for robusto. Lembrem se do manifesto ágil !!

Ágil seria entregar por partes, não um projeto robusto. Mas se está dando certo pra você, tudo bem, não existe solução única.

1 curtida

É possível fazer isso sem Hibernate tb. lol

Mas ferramentas como Hibernate foram criadas justamente para que o desenvolvedor não tenha que fazer isso, ou seja, não ter que pensar em termos de tabelas, SQL, e como escrever queries otimizadas. Em teoria você apenas navegaria pelo objeto e suas associações.

Sim, acredito que já tenha ficado claro que não defendo usar Hibernate nestes casos, é complicação desnecessária, além de consumir recurso em vão. Só te expliquei que é possível.

Eita mais uma coisa pra eu saber, se tá sendo complicado JPA, com mais essa de CDI então!

:grin::grin::smile:

altera os dados no phpmyadmin > info não aparece nos objetos > desliga o cache > problema de performance > desenvolvedor deixa de de desenvolver a aplicação e a UI pra otimizar query.

É possível, mas pelo menos uns 5 graus de separação do problema original.

Como o javaflex disse, não é a melhor pratica, mas como é desktop, apenas 1 usuário…

Se fosse um web server, vc teria que aproveitar o mesmo EntityManagerFactory, senão seu servidor ia pro saco rapidinho.

1 curtida