Problema com cachê - HIBERNATE + VRAPTOR

Bom dia qdo programei em swing usava o sessao.clear para remover o cache do hibernate, agora estou usando JEE + vraptor e o .clear não quer funcionar, acredito que o componente do vraptor necessite de alguma configuração.

Alguém poderia me dar uma ajuda?

Por favor, não marque os tópicos com informações óbvias, em destaque, como [AJUDA], [DUVIDA] ou [SOCORRO] ou [URGENTE].

Leia nosso guia de postagem:
http://www.guj.com.br/java/287484-gujnautas-how-to

No guia não diz que é proibido!

se vc usa a session que veio do vraptor, a session é nova a cada requisição, daí vc não precisa dar o clear.

a session é do vraptor se vc recebeu no construtor e registrou o parametro packages do vraptor no web.xml apontando pro pacote que termina com hibernate.

Lucas
Tem algo muito estranho, quando eu altero algum registro no banco via o MysqlFront, e clico em atualizar no grid ou atualizo a página F5, o registro não é atualizado, se eu fechar o browser e executar o programa novamente mostra o registro atualizado corretamente.

meu web.xml está assim:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name> teste </display-name>

        <context-param>
        	<param-name>br.com.caelum.vraptor.packages</param-name>	        
                <param-value>br.com.caelum.vraptor.util.extjs</param-value>
         </context-param>   
    	<filter>
		<filter-name>vraptor</filter-name>
		<filter-class>br.com.caelum.vraptor.VRaptor</filter-class>                
	</filter>

	<filter-mapping>
		<filter-name>vraptor</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>                     
</web-app>
@Component
@RequestScoped
public class CriadorDeSession implements ComponentFactory<Session> {
    private final SessionFactory factory;
    private Session session;

    public CriadorDeSession(SessionFactory factory) {
        this.factory = factory;
    }
    
    @PostConstruct
    private void abre(){
        this.session=factory.openSession();        
    }
    
    @PreDestroy    
    private void fecha(){
        this.session.close();
    }
    
    public Session getInstance() {        
        return session;      
    }        
}
@Component
public class PessoaDao {        
    private final CriadorDeSession session;    
    public PessoaDao(CriadorDeSession session) {
        this.session=session;
    }                

    public List<Pessoa> getPessoas(int start,int limit){                
        try {
            return session.getInstance().createQuery("from Pessoa order by nome").setFirstResult(start).setMaxResults(limit).list();                      
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
            return null;
        }finally{    
        }             
    }       
}

(off) vc tem noção que esse JOptionPane vai aparecer só no servidor, certo?

vc tá usando transações na hora de salvar os dados?

(off) vc tem noção que esse JOptionPane vai aparecer só no servidor, certo?
kkk sei sim, so fiz ele para ver se estava entrando na exceção, mas vou refatorar o codigo dpois.

vc tá usando transações na hora de salvar os dados?
Na hora de salvar eu usarei transacao, em outros sistemas que desenvolvo mas em swing + hibenate eu uso. Neste caso os dados eu estou inserindo e alterando direto pelo mysql posteriormente irei implementar o CRUD.

ao invés de usar o

public PessoaDao(CriadorDeSession session) {  
        this.session=session;  
    }   

faça apenas:

 public PessoaDao(Session session) {  
        this.session=session;  
    }                     

Lucas muito estranho, fiz a alteração que vc pediu e msm assim não funcionou!

Eu acho que o vRaptor não está me dando uma session nova a cada requisição, alterei o scopo da fabrica de sessao só de teste e o funcionou certinho como esperado.
Sei que essa alteracao não uma boa pratica devido a performace.

@Component
//@ApplicationScoped
@RequestScoped
public class CriadorDeSessionFactory implements ComponentFactory<SessionFactory> {
    private SessionFactory sessionFactory;

    @PostConstruct
    public void abre() {
        try {
            this.sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

        } catch (Throwable ex) {
            // Log the exception. 
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    
    @PreDestroy
    public void fecha() {
        this.sessionFactory.close();
    }

    public SessionFactory getInstance() {
        return this.sessionFactory;
    }
}

essa classe não pode ser request scoped… só a criador de session pode…

o melhor a fazer é remover esses dois component factories e registrar o componente do VRaptor que faz isso:

http://vraptor.caelum.com.br/pt/docs/componentes-utilitarios-opcionais/

registre o pacote do …vraptor.hibernate.

Lucas, como ficaria no meu caso?

Tentei alterar o web.xml para isso:

<context-param>
        	<param-name>br.com.caelum.vraptor.packages</param-name>	        
                <param-value>br.com.caelum.vraptor.util.extjs</param-value>
                <param-value> br.com.caelum.vraptor.util.hibernate</param-value>
         </context-param> 

deu um monte de erros

HTTP Status 500 - Error creating bean with name 'loginController': Unsatisfied dependency expressed through constructor argument with index 2 of type [br.dao.PessoaDao]: : Error creating bean with name 'pessoaDao': Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.Session]: : Error creating bean with name 'br.com.caelum.vraptor.util.hibernate.SessionCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sessionCreator': Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.SessionFactory]: : No unique bean of type [org.hibernate.SessionFactory] is defined: expected single matching bean but found 2: [br.bd.CriadorDeSessionFactory, br.com.caelum.vraptor.util.hibernate.SessionFactoryCreator]; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [org.hibernate.SessionFactory] is defined: expected single matching bean but found 2: [br.bd.CriadorDeSessionFactory, br.com.caelum.vraptor.util.hibernate.SessionFactoryCreator]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.hibernate.SessionCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sessionCreator': Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.SessionFactory]: : No unique bean of type [org.hibernate.SessionFactory] is defined: expected single matching bean but found 2: [br.bd.CriadorDeSessionFactory, br.com.caelum.vraptor.util.hibernate.SessionFactoryCreator]; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [org.hibernate.SessionFactory] is defined: expected single matching bean but found 2: [br.bd.CriadorDeSessionFactory, br.com.caelum.vraptor.util.hibernate.SessionFactoryCreator]; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'pessoaDao': Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.Session]: : Error creating bean with name 'br.com.caelum.vraptor.util.hibernate.SessionCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sessionCreator': Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.SessionFactory]: : No unique bean of type [org.hibernate.SessionFactory] is defined: expected single matching bean but found 2: [br.bd.CriadorDeSessionFactory, br.com.caelum.vraptor.util.hibernate.SessionFactoryCreator]; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [org.hibernate.SessionFactory] is defined: expected single matching bean but found 2: [br.bd.CriadorDeSessionFactory, br.com.caelum.vraptor.util.hibernate.SessionFactoryCreator]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.util.hibernate.SessionCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sessionCreator': Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.SessionFactory]: : No unique bean of type [org.hibernate.SessionFactory] is defined: expected single matching bean but found 2: [br.bd.CriadorDeSessionFactory, br.com.caelum.vraptor.util.hibernate.SessionFactoryCreator]; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [org.hibernate.SessionFactory] is defined: expected single matching bean but found 2: [br.bd.CriadorDeSessionFactory, br.com.caelum.vraptor.util.hibernate.SessionFactoryCreator]

um só, com os valores separados por vírgula.

Lucas deu certo, agora ta atualizando normal.
Muito Obrigado.

Ficou assim:
Web.mxl

<context-param>
        	<param-name>br.com.caelum.vraptor.packages</param-name>	        
                <param-value>br.com.caelum.vraptor.util.extjs,
                             br.com.caelum.vraptor.util.hibernate
                </param-value>
         </context-param>   

DAO

@Component
public class MinhaClasseDao {        
    private final Session session;    
    public MinhaClasseDao(Session session) {
        this.session=session;
    }   
.
.
.
}