Problema ManagedBean Sessão JSF

To com um problema um tanto quanto estranho… estou fazendo uma validação de uma entidade Funcionario… Faço uma consulta com Hibernate pra saber se o funcionário existe no banco… se Sim… ele navega pra próxima página…
Esse ManagedBean Funcionario, eu adicionei com escopo de sessão…

    <managed-bean>
        <managed-bean-name>func</managed-bean-name>
        <managed-bean-class>MngBeans.Funcionario</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
     </managed-bean>

Pelo que sei, essa instancia vai ficar disponível para mim durante a sessão do usuário…

Criei um form de login… Onde são necessários RG, Data de Nascimento e Código da Empresa (Sem senha…)…

Esse é meu ManagedBean que valida o usuário:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package MngBeans;

import DAOs.FuncionarioDAO;
import javax.faces.context.FacesContext;
import org.hibernate.Session;


/**
 *
 * @author Vinicius
 */
public class LoginBean {

    /** Creates a new instance of LoginBean */
    public LoginBean() {
    }

    public String logar(){
        try{
            Session session = Util.HibernateUtil.getSessionFactory().openSession();
            FuncionarioDAO acessoDAO = new FuncionarioDAO(session);

            FacesContext fc = FacesContext.getCurrentInstance();
            Funcionario func = (Funcionario) fc.getApplication().getVariableResolver().resolveVariable(fc, "func");
            FuncionarioPK func_pk = (FuncionarioPK) fc.getApplication().getVariableResolver().resolveVariable(fc, "funcpk");
            Empresa empresa = (Empresa) fc.getApplication().getVariableResolver().resolveVariable(fc, "empresa");

            func_pk.setEmpresaId(empresa.getId());
            func.setFuncionarioPK(func_pk);

            return acessoDAO.verificaAutenticacao(func);
        }catch(Exception e){
            return "Erro no VariableResolver." + e.getMessage();
        }
    }

}

Dai que vem o seguinte… No DAO eu faço a seguinte validação:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DAOs;

import MngBeans.Funcionario;
import MngBeans.FuncionarioPK;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Vinicius
 */
public class FuncionarioDAO {
    private Session session;

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

    @SuppressWarnings("unchecked")
    public String verificaAutenticacao(Funcionario func) {
        try{
            Query query = session.createQuery("SELECT u FROM Funcionario u WHERE u.funcionarioPK.rg =:rg AND u.funcionarioPK.empresaId =:empresa AND u.dtNascimento =:birth");
            query.setInteger("rg", func.getFuncionarioPK().getRg());
            query.setInteger("empresa", func.getFuncionarioPK().getEmpresaId());
            query.setDate("birth",func.getDtNascimento());

            Funcionario fnc = (Funcionario) query.uniqueResult();

            if (fnc == null) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Funcionário Desconhecido"));

                return null;
            } else if(fnc.getAtivo().getId() == 3) {
                func = fnc;
                return "usr_ok";
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Funcionário desligado"));

                return null;
            }
        }catch(Exception e){
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Erro no DAO." + e.getMessage()));

            return null;
        }

    }
}

Veja que eu passei como parametro o ManagedBean de Funcionário que está na sessão… Dai faço a consulta… se ela for ok… eu retorno usr_ok e navego para a página… Más tem um porém… o meu Funcionário que veio como parametro tem apenas alguns dados setados (somente os dados necessários para fazer login)… Depois que faço a consulta, o Hibernate me volta um funcionário com todos os dados preenchidos… (No meu código Funcionario fnc = (Funcionario) query.uniqueResult())… O que eu faço então é atribuir esse Funcionário ao meu managedBean que está na sessão:


else if(fnc.getAtivo().getId() == 3) {
                func = fnc;
                return "usr_ok";
            }

Agora o mais estranho… Depois de navegar para a próxima página… se eu colocar isso:

        <h:outputText value="#{func.dtNascimento}"/><br>
        <h:outputText value="#{func.nome}"/><br>

Apenas a data de nascimento sai na tela… Será que esse lance de atribuir a entidade de retorno do Hibernate para O managedbean não funciona??? COmo eu faria? Estou fazendo certo?

Não tenho muita vivencia com Hibernate, porém qto a parte java se ele estiver trazendo certo e estranho o que acontece…

Porém você qdo usa o debug após a busca ele preenche os dados corretamente, antes de direcionar pra outra pagina?.

Cara… o Bean ta certinho… já tinha depurado… Inclusive se eu der set em todos os campos ele vai certnho dai… soh que é foda ficar dando set em cada um… Será que tem uma alternativa?

se a data sai, mas o nome não, estranho.

você tem o método getNome() ? Vê se não tá getName() :shock:

O data sai pq provalmente foi quando o cara definiu o valor da data no formulario de login… Não tem como eu ter errado o nome do campo e gets e sets pq gerou tudo automático… se alguém souber alguma solução…agradeço… por enquanto estou fazendo set em todos os campos

fiquei curioso:

query.setInteger("rg", func.getFuncionarioPK().getRg()); query.setInteger("empresa", func.getFuncionarioPK().getEmpresaId()); query.setDate("birth",func.getDtNascimento());

Também fiquei intrigado, me ajudem a entender o problema?

Se o cabra só é requisitado a digitar : RG. dtNascimento e código da empresa… pq após o “clique” dele, você espera mais parâmetroS para serem validados no teu DAO?

No caso a data de nascimento é “printada” na tela, pois o usuário digitou e está na sessão, já o nome não foi digitado e se você não setá-lo, de onde ele viria?

Num intindi não O_O!

Não… eu uso esses 3 paremetros pra fazer uma consulta na tabela do banco…

Quando o hibernate encontra esse cara ele retorna uma entidade preenchida com todos os campos da tabela…

Agora pensa comigo: A entidade que usei pra fazer a pesquisa tem somente 3 campos setados…

Utilizei esses campos pra preencher a Query do hibernate e ele encontrou uma resposta… Soh que quando ele volta a resposta estão todos os atributos preenchidos… Dai quero que o cara que está com apenas 3 parametros passe a ser o cara que veio do hibernate com todos preenchidos pra eu poder usar na sessão…

Eu não consegui isso fazendo… Funcionario antigo = Funcionario funcionario_do_hibernate (resumidamente)

Somente setando cada parametro do antigo… antigo.nome(funcionario_do_hibernate.getNome); e assim por diante

Não sei se fui claro o suficiente.

Foi sim! Pra mim ficou bem claro agora !

Não seria o caso de você setar esse objeto de retorno na sessão? tipo : sessionScope.setAttribute(“func” objetoFuncionarioQueVeioDoHibernate); , ou to viajando no

problema?

Até pensei nisso… más acho que o session não é o mesmo session do contexto JSF… deve ter que jogar dentro do contexto JSF pra substituir o antigo… sei lá… vc conhece como pegar a sessão do contexto JSF?

Aaa, sim sim, eu estava falando da sessão do JSF mesmo, não do Hibernate… pra pegar ela é assim :

HttpSession sessionScope = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);  
sessionScope.setAttribute("func", FuncionarioAlterado);

Perfeito era isso mesmo!!! Valeu pela ajuda =)…

Viva os Hello World =]