Nossa!
se JPA não tem uma solução pra isso e apenas ele preenche objetos com dados do BD uma única vez, sinceramente não sei pra que ele serve
Se está usando a implentação do Hibernate isso vai ocorrer se não abrir uma nova session (não factory) para cada requisição do usuário. Agora se o JPA não permite isso, não sei informar, nunca passei por motivo real pra usar padrão JPA, Hibernate puro já passei por projeto usando sim e sem esses problemas, por abrir uma nova session a cada requisição do usuário ou por usar StatelessSession.
Não é solução pra ninguém. Por isso está no Javadoc como que deve ser feito.
Pode não ser para nós, e provavelmente para ele não deveria ser também. As vezes isto está acima de razões, envolve religião também, a Sun infelizmente plantou muito isso pregando especificações padrões, e quem vai pro mercado fica refém.
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 !
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.
É 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.