Isso é cache do Hibernate?

Está acontecendo algo que nunca aconteceu comigo em outros projetos com hibernate.

Tenho apenas 10 registros em uma tabela do banco.
Inicio uma action que lista esses registros.
Ao lado de cada um deles coloquei um textbox e um botão de submit que faz update do registro com o conteúdo do textbox.
Após o update a mesma pagina é chamada listando novamente os registros.

O problema é que as vezes aparece na lista o registro anterior e não o atualizado.
Exemplo, digamos que os registros sejam:
Registro1
Registro2
Registro3…

Ai eu mudo o registro Registro2 para RegistroAtualizado e ele mostra na lista.
Registro1
RegistroAtualizado
Registro3

Oq está certo, mas se eu ficar dando F5 para listar ora ele mostra o correto como acima, ora ele mostra errado como o antigo.
Registro1
Registro2
Registro3

Ele faz isso para vários registros e fica uma loucura só !
Parece que é algum cache, mas não sei como fazer pra tirar.

meu hibernate.cfg.xml

<hibernate-configuration>

	<session-factory>
		
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mysql</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password"></property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
		<property name="hibernate.hbm2ddl.auto"></property>
		<property name="hibernate.show_sql">true</property>
	    <property name="hibernate.format_sql">true</property>
		
		<mapping class="cbr.com.app.Registro"/>
		
	
	</session-factory>

</hibernate-configuration>

Oq fazer pra resolver isso ? :shock:

Do hibernate não, mas pode ser do browser.
Está utilizando um browser externo ou o interno do eclipse?

Estou utilizando o chrome e testei no firefox tb
Acontece a mesma coisa nos dois, mesmo apertando ctrl+F5
:cry:

Ok.
Está desenvolvendo com hibernate e o que mais. Vi que citou action, é vRaptor ou Struts ou outro?

Struts 1.3 e websphere

Parei o servidor, startei novamente e mandei listar varias vezes.
Em todas ele trouxe os registro atualizados corretamente.
Mas se eu alterar algum e mandar listar ele faz errado de novo.
Se eu atualizar a metade e ficar dando F5, fica tudo muito doido
:lol:

Posta sua classe ai. Vc está limpando a lista sempre q vai fazer a busca dos dados dela no banco? ou da um add?

list = new ArrayList()

Toda vez q chama a action list() ele tras uma lista atraves do findAll()

Isso tudo é feito com uma classe chamada Teste.

@Entity
public class Teste implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	
	private String texto;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getTexto() {
		return texto;
	}

	public void setTexto(String texto) {
		this.texto = texto;
	}
	
}
public ActionForward list(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		List<Teste> testes = testeDAO.findAll();
		request.setAttribute("testes", testes);
		
		return mapping.findForward("teste");
	}
abstract class GenericDAO<T> implements Serializable {

	private static final long serialVersionUID = -4267978367898190996L;

	private static SessionFactory sessionFactory = new Configuration().configure("hibernate.cfg_MYSQL.xml").buildSessionFactory();

	private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
	
	private Class<T> entityClass; 
	
	public GenericDAO(Class<T> entityClass) { 
        this.entityClass = entityClass; 
    }

	public Session getSession() {
		Session session = threadLocal.get();
		if (session == null) {
			session = sessionFactory.openSession();
			threadLocal.set(session);
		}
		return session;
	}

public List<T> findAll() { 
		Criteria criteria = getSession().createCriteria(entityClass);
		criteria.setMaxResults(500);

		return criteria.list();
    }
}

na sua classe Teste, seria legal por a anotação

@Column(name="TEXTO")
private String texto;

Outro fator para verificar é se vc está realizando o “beginTransaction” e “commit”.

Parece que resolvi o meu problema.
Pesquisei e vi que o problema poderia ser uma falha para fechar e remover uma sessão do hibernate da ThreadLocal.
Antes estava assim:

private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

public Session getSession() {
		Session session = threadLocal.get();
		if (session == null) {
			session = sessionFactory.openSession();
			threadLocal.set(session);
		}
		return session;
	}

Agora está assim:

private Session session;

public Session getSession() {
		if (session == null || !session.isOpen()) {
			session = sessionFactory.openSession();
		}
		return session;
	}

Vocês vêm algum problema em deixar dessa forma ?
Parece que resolveu meu problema atual de mostrar dados desatualizados.

Por exemplo, pra salvar faço assim:

		genericDAO.beginTransaction();
		genericDAO.save(teste);
		genericDAO.commit();
		genericDAO.closeSession();

Para apagar um registro:

                genericDAO.beginTransaction();
		Teste testeToDelete = genericDAO.findById(teste.getId());
		genericDAO.delete(testeToDelete);
		genericDAO.commit();
		genericDAO.closeSession();

Para buscar:

                List<Teste> list = genericDAO.findAll();
		genericDAO.closeSession();

Algum problema ?
Nas buscas tb não abro transação.

Tente colocar na sua classe de Entidade a anotacção @Cacheable(false), isso ira desativar o cache para essa entidade.