Problema com cachê - HIBERNATE + VRAPTOR

12 respostas
C

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?

12 Respostas

ViniGodoy

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

C

No guia não diz que é proibido!

Lucas_Cavalcanti

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.

C

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{    
        }             
    }       
}
Lucas_Cavalcanti

(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?

C

(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.

Lucas_Cavalcanti

ao invés de usar o

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

faça apenas:

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

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;
    }
}
Lucas_Cavalcanti

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.

C

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]
Lucas_Cavalcanti

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

C

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;
    }   
.
.
.
}
Criado 30 de janeiro de 2013
Ultima resposta 5 de fev. de 2013
Respostas 12
Participantes 3