Olá,
Estou tendo um problema de sessions com o hibernate no vraptor.
Segui a apostila da caelum para criar as sessions:
public class CriadorSession {
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;
public static Session getSession(){
Configuration configuration = new Configuration();
configuration.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory.openSession();
}
}
Tenho a seguinte DAO… estou atribuindo no login do usuário as permissões buscando do banco com “session.createCriteria”.
private final Session session;
public static final int ADMIN = 1,OTC=2,SHOUSE=3;
/**
* Cria Sessão vraptor
*/
public DaoGrupoUsuario() {
this.session = CriadorSession.getSession();
}
public boolean permissaoAdmin(Usuario logado) {
if(logado == null)return false;
return (this.carrega(logado.getIdUsuario(), ADMIN)!=null);
}
public boolean permissaoOTC(Usuario logado) {
if(logado == null)return false;
return (this.carrega(logado.getIdUsuario(), OTC)!=null);
}
public boolean permissaoSHOUSE(Usuario logado) {
if(logado == null)return false;
return (this.carrega(logado.getIdUsuario(), SHOUSE)!=null);
}
public GrupoUsuario carrega(int idUsuario, int idGrupo){
return (GrupoUsuario) session.createCriteria(GrupoUsuario.class).add(Restrictions.eq("idUsuario", idUsuario)).add(Restrictions.eq("idGrupo", idGrupo)).uniqueResult();
}
public void adiciona(Usuario usuario, int idGrupo) {
Transaction tx = this.session.beginTransaction();
GrupoUsuario grupo = new GrupoUsuario();
grupo.setIdGrupo(idGrupo);
grupo.setIdUsuario(usuario.getIdUsuario());
this.session.save(grupo);
tx.commit();
}
public void limpaSession() {
this.session.flush();
this.session.clear();
}
Até aqui tudo bem.
Tenho uma classe UsuarioWeb de SessionScopped
@Component
@SessionScoped
public class UsuarioWeb
{
private Usuario logado;
private final DaoGrupoUsuario daogrupo;
public UsuarioWeb(DaoGrupoUsuario daogrupo){
this.daogrupo = daogrupo;
}
public static final int NIVELADMIN =3,NIVELOTC=2,NIVELSHOUSE=1;
private int nivelPermissao = 0;
public int getNivelPermissao() {
return nivelPermissao;
}
public void setNivelPermissao(int nivelPermissao) {
this.nivelPermissao = nivelPermissao;
}
public Usuario getLogado() {
return logado;
}
public void setLogado(Usuario logado) {
this.logado = logado;
nivelPermissao= 0;
this.setAdmin(this.daogrupo.permissaoAdmin(logado));
this.setOtc(this.daogrupo.permissaoOTC(logado));
this.setShouse(this.daogrupo.permissaoSHOUSE(logado));
}
public void logOut() {
this.logado= null;
daogrupo.limpaSession();
}
PROBLEMA:
- Eu acesso o sistema sem permissão ( o metodo carregar , retorna NULL )
- Atribuo a permissão no banco de dados com o método adicionar ( via resource jsp )
- Faço o usuário fazer logout
- Na próxima vez que o usuário faz login o mesmo método da DAO “carrega” novamente do banco a permissão:
i session.createCriteria(GrupoUsuario.class).add(Restrictions.eq(“idUsuario”, idUsuario)).add(Restrictions.eq(“idGrupo”, idGrupo)).uniqueResult();[/i]
Isto deveria retornar o meu bean de acesso, no entanto retorna null . ( consultei no banco e está lá, executei o mesmo SQL do log )
5.Notei que cada vez que eu restarto o servidor ele atualiza esta informação e retorna o GrupoUsuario correto.
Não sei se o problema está no SessionScopped, pois nas demais consultas o createCriteria funciona corretamente.