Pessoal, estou com um problema muito chato. Pesquisei muito e não consegui resolver.
É o seguinte, toda vez que eu carrego a pagina pela primeira vez… ela carrega os dados exatamente como esta no banco de dados, entretanto caso alguma alteração tenha sido feita, não importa o jeito que eu tento atualizar a pagina e os dados carregados sempre são iguais a primeira vez que eu carreguei, a única solução é quando eu reinicio o tomcat, entretanto minha aplicação não pode ficar com esse bug pois a alteração dos dados ocorre numa frequência muito curta!
Para resolver este problema ou mesmo podermos opinar sobre o que ocorre, precisamos entender qual o contexto no qual esta situação ocorre.
Você tem uma grid, pelo que entendi e, esta grid não atualiza.
Pois bem, quais são as situações?
- Utiliza JDBC? JPA? Se JPA qual a implementação? A alteração nos dados é efetuada pelo mesmo sistema? É efetuada diretamente na base de dados?
- A aplicação conta com acesso direto à base de dados ou é através de pool de conexões?
JPA = Hibernate.
Creio que seja pool de conexões.
segue a configuração do Hibernate!
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://xxxxxxx:3306/sfmsp-homo?zeroDateTimeBehavior=convertToNull</property>
<property name="connection.username">root</property>
<property name="connection.password">xxxxx</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Mapeamento das entidades -->
<mapping class="hagape.domain.tb_tipo_negocio" />
<mapping class="hagape.domain.tb_categoria_produto" />
<mapping class="hagape.domain.tb_produto" />
<mapping class="hagape.domain.tb_medida" />
<mapping class="hagape.domain.tb_estoque" />
<mapping class="hagape.domain.tb_estoque_produto" />
<mapping class="hagape.domain.tb_cidade" />
<mapping class="hagape.domain.tb_uf" />
<mapping class="hagape.domain.tb_unidade_medida" />
</session-factory>
e a classe bean:
package hagape.bean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.Application;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import org.omnifaces.util.Messages;
import hagape.dao.EstoqueDAO;
import hagape.dao.EstoqueProdutoDAO;
import hagape.dao.ProdutoDAO;
import hagape.domain.tb_estoque;
import hagape.domain.tb_estoque_produto;
import hagape.domain.tb_produto;
@SuppressWarnings(“serial”)
@ViewScoped
@ManagedBean
public class EstoqueProdutoBean implements Serializable {
private tb_estoque_produto estoqueProduto;
private List<tb_estoque> estoques;
private List<tb_produto> produtos;
private List<tb_estoque_produto> estoqueProdutos;
public tb_estoque_produto getEstoqueProduto() {
return estoqueProduto;
}
public void setEstoqueProduto(tb_estoque_produto estoqueProduto) {
this.estoqueProduto = estoqueProduto;
}
public List<tb_estoque> getEstoques() {
return estoques;
}
public void setEstoques(List<tb_estoque> estoques) {
this.estoques = estoques;
}
public List<tb_produto> getProdutos() {
return produtos;
}
public void setProdutos(List<tb_produto> produtos) {
this.produtos = produtos;
}
public List<tb_estoque_produto> getEstoqueProdutos() {
return estoqueProdutos;
}
public void setEstoqueProdutos(List<tb_estoque_produto> estoqueProdutos) {
this.estoqueProdutos = estoqueProdutos;
}
@PostConstruct
public void listar() {
try {
estoqueProduto = new tb_estoque_produto();
ProdutoDAO produtoDAO = new ProdutoDAO();
produtos = produtoDAO.listar("txt_nome");
EstoqueDAO estoqueDAO = new EstoqueDAO();
estoques = estoqueDAO.listar();
EstoqueProdutoDAO estoqueProdutoDAO = new EstoqueProdutoDAO();
estoqueProdutos = estoqueProdutoDAO.listar();
FacesContext context = FacesContext.getCurrentInstance();
Application application = context.getApplication();
javax.faces.application.ViewHandler viewHandler = application.getViewHandler();
UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());
context.setViewRoot(viewRoot);
context.renderResponse();
} catch (RuntimeException e) {
e.printStackTrace();
Messages.addGlobalError("Erro ao tentar carregar 'Lista'!");
}
}
public void refresh() {
try {
estoqueProduto = new tb_estoque_produto();
ProdutoDAO produtoDAO = new ProdutoDAO();
produtos = produtoDAO.listar("txt_nome");
EstoqueDAO estoqueDAO = new EstoqueDAO();
estoques = estoqueDAO.listar();
EstoqueProdutoDAO estoqueProdutoDAO = new EstoqueProdutoDAO();
estoqueProdutos = new ArrayList<>();
List<tb_estoque_produto> estoqueProdutos1 = estoqueProdutoDAO.listar();
estoqueProdutos = estoqueProdutos1;
FacesContext context = FacesContext.getCurrentInstance();
Application application = context.getApplication();
javax.faces.application.ViewHandler viewHandler = application.getViewHandler();
UIViewRoot viewRoot = viewHandler.createView(context, context.getViewRoot().getViewId());
context.setViewRoot(viewRoot);
context.renderResponse();
} catch (RuntimeException e) {
e.printStackTrace();
Messages.addGlobalError("Erro ao tentar carregar 'Lista'!");
}
}
}
Como você esta alterando os dados?
diretamente no banco de dados, ou o sistema da empresa… o problema e apartir da primeira vez que eu acesso eu criei um botao pra dar refresh mas sempre ele carrega os dados da primeira vez que eu acesso a pagina isso que e foda pq nao da erro … entao creio que o problema seja algum tipo de cache sei la alguma coisa parecida!
Um amigo meu do trabalho estava enfrentando uma situação semelhante.
No caso dele o problema era que um relacionamento do projeto estava sendo carregado como EAGER.
Existe algum lugar do seu projeto que você esteja fazendo EAGER load?
Mostra o código que está fazendo a gravação e em que momento você fecha a session do Hibernate. Pra ter decidido usar hibernate então você quer hibernar os dados por um tempo, isso está acontecendo, só tem que ver o momento de encerrar isso, realizando o flush, commitando e fechando a sessão.
Pessoal consegui encontrar o erro…
eu abri uma nova transação e dei comit no final do metodo assim que possivel eu disponibilizo o código porque isso pode ser duvida pra muitas pessoas novas tbm …
Obrigado pessoal!
Com certeza, o cache do hibernate é separado do banco e não tem como advinhar quando vc altera os dados diretamente no banco.