selectOneMenu + hibernate

7 respostas
F

Quando eu usava SQL comum conseguia facilmente usar o selectItem para carregar um selectOneMenu, porém agora com hibernate eu tenho que pegar a entidade e não só o código da outra tabela, testei vários conversores que achei na net mas nenhum está dando certo. É possível fazer isso sem conversor? Ou alguém tem um conversor funcionando para mostrar como ficou o código?

Obrigado

7 Respostas

M

Opa,

Pelo que eu entendi tem o BeanUtils com o método copyProperties para copiar valores de um objeto para outro.

:okok:

F

Na verdade só preciso pegar o código o item selecionado no selectOneMenu, só que ele retorna o objeto e dá erro: Conversion Error setting value ‘1’ for ‘null Converter’.

F

Tentei fazer assim:

método:

public ArrayList<SelectItem> getListarComboBox() {
        ArrayList savedGrupos = new ArrayList<SelectItem>();
        List<Grupo> grupos;
        grupos = grupoDao.listar("grupo");
        for (Grupo grupo: grupos) {
            SelectItem item = new SelectItem();
            item.setLabel(grupo.getGrupo());
            item.setValue(grupo);
            savedGrupos.add(item);
        }
        return savedGrupos;
    }

jsp:

<h:selectOneMenu id="grupo" value="#{usuarioRequest.usuario.grupo}" converter="conversorComboBox">
      <f:selectItems value="#{usuarioRequest.listarComboBox}"/>
   </h:selectOneMenu>

Converter:

public Object getAsObject(FacesContext context, UIComponent component, String value) {
        Map idsToObjects = new HashMap();
        if (value.equals(null)) {
            return null;
        }

        Grupo grupo = (Grupo)idsToObjects.get(value);
        if (grupo == null) {
            Session session = HibernateSessionFactory.openSession();
            GrupoDao grupoDao = new GrupoDao(session);
            Grupo grupo = grupoDao.buscar(Integer.parseInt(value));
            idsToObjects.put(value, grupo);
        }
       
        return grupo;
    }

    public String getAsString(FacesContext context, UIComponent component, Object value) {
        Grupo grupo = (Grupo) value;
        return grupo.getId().toString();
   }

Carrega normal os valores no combo, mas na hora de dar o submit apresenta o erro: Validation Error: Value is not valid

M

Opa,

Bom até o momento ainda não consegui colocar para o campo valor uma propriedade que não seja String, certamente eles devem corrigir isto nas próximas versões.

:okok:

F

Consegui fazer funcionar usando um conversor assim:

public class GrupoConverter implements Converter {
    
    public Object getAsObject(FacesContext facesContext, UIComponent uIComponent, String string) {
        if (string == null) {
            return null;
        }
        Integer id = new Integer(string);

        Session session = HibernateSessionFactory.openSession();
        GrupoDao grupoDao = new GrupoDao(session);
        return grupoDao.buscar(id);
    }

    public String getAsString(FacesContext facesContext, UIComponent uIComponent, Object object) {
        if (object == null) {
            return null;
        }
        if(object instanceof Grupo) {
            Grupo o = (Grupo) object;
            return "" + o.getId();
        } else {
            throw new IllegalArgumentException("object:" + object + " of type:" + object.getClass().getName() + "; expected type: Grupo");
        }
    }
}

A pergunta agora é, será possível criar um conversor genérico para usar por qualquer selectOneMenu?

M

Você fala para qualquer tipo de dados? Se for, não existe, sugiro ir criando conversores para os campos que ainda não existem.

:okok:

J

Olá Marcosouza!!!

Preciso popular um combo. Peguei um exemplo aqui no grupo:

public class Typeinheritances { 

private String description; 

private Map typeinheritancesMap = new HashMap(); 

public String getDescription() { 
return description; 
} 

public void setDescription(String description) { 
this.description = description; 
} 

public Map getDescriptionMap() { 
typeinheritancesMap.put("RJ", "RJ"); 
typeinheritancesMap.put("AC", "AC"); 
typeinheritancesMap.put("AL", "AL"); 
return typeinheritancesMap; 
}

Só que preciso que os valores da combo sejam o resultado de uma query. Tenho a lista abaixo:

public List getTypeInheritances() {
       try{
          HibernateUtil.beginTransaction();
          Session session = HibernateUtil.currentSession();
          org.hibernate.Query query = session.createQuery(
          "select object(o) from Typeinheritance as o");
          List list= query.list(); 
          HibernateUtil.commitTransaction();
          HibernateUtil.closeSession();
          return list;
         
       }catch(Exception e1){ 
              addMessage("Erro em listar typeinheritances!"); 
              return null;
            }    
   }
e a minha jsp:

            <h:selectOneMenu id="typeinheritance_list" 
                         value="#{InheritanceFacade.description_ti}">
                <f:selectItems value="#{Typeinheritances.descriptionMap}" />
            </h:selectOneMenu>

Se eu chamar diretamente a lista: ="#{TypeinheritanceFacade.Typeinheritances}" , tenho erro de cast. Podes me ajudar a resolver isso, mas se possivel com alguns detalhes, sou iniciante em java!!

Criado 20 de outubro de 2006
Ultima resposta 22 de jan. de 2007
Respostas 7
Participantes 3