Como pegar um Item de uma SelectOneMenu para jogar num banco com Hibernate

3 respostas
W

Olá a todos, estou há alguns dias travado nisso aqui, já vi algumas soluções, mas não funcionaram, gostaria da ajuda de vocês.
Vou colocar os codigos aqui e tentar explicar certinho.

NovoPatrocinador.xhtml
<ui:define name="body">
        <h:outputText  value="Digite os dados do novo Patrocinador" />
        <h:form>
            <h:panelGrid cellpadding="0" cellspacing="0" columns="2"
                         style="vertical-align:middle">
                <h:outputText  value="Nome do patrocinador: " />
                <h:inputText   value="#{HandlerPatrocinador.patrocinador.patrocinadorNome}" />
                <h:outputText  value="Valor do patrocinio:" />
                <h:inputText   value="#{HandlerPatrocinador.patrocinador.patrocinioValor}" />
                <h:outputText  value="Lutador que é patrocinado:" />
                <h:selectOneMenu>
                    <f:selectItems value="#{HandlerPatrocinador.lutadoresParaComboBox}"></f:selectItems>
                </h:selectOneMenu>                
                <h:commandButton value="Salvar" styleClass="groovybutton" action="#{HandlerPatrocinador.salvaPatrocinador}" />
            </h:panelGrid>
        </h:form>

    </ui:define>

HandlerPatrocinador.java

private Patrocinador patrocinador = new Patrocinador();
    private List<Patrocinador> patrocinadores = new ArrayList<Patrocinador>();
    private List<SelectItem> lutadoresParaComboBox = new ArrayList<SelectItem>();

    
    public void salvaPatrocinador() {

        Session session = HibernateUtil.openSession();
        Transaction tx = session.beginTransaction();
        DAO<Patrocinador> dao = new DAO<Patrocinador>(session, Patrocinador.class);
        dao.adiciona(patrocinador);
        this.patrocinador = new Patrocinador();
        tx.commit();

    }

    public Patrocinador getPatrocinador() {
        return patrocinador;
    }

    public List<Patrocinador> getPatrocinadores() {
        Session session = HibernateUtil.openSession();
        Transaction tx = session.beginTransaction();
        DAO<Patrocinador> dao = new DAO<Patrocinador>(session, Patrocinador.class);
        tx.commit();
        return dao.list();
    }

    private HandlerLutador pegaHandlerLutador() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        HandlerLutador handler = (HandlerLutador) facesContext.getApplication().getVariableResolver().resolveVariable(facesContext, "HandlerLutador");
        return handler;
    }

    public List<SelectItem> getLutadoresParaComboBox() {
        Session session = HibernateUtil.openSession();
        Transaction tx = session.beginTransaction();
        List<SelectItem> lista = new ArrayList<SelectItem>();
        HandlerLutador handler = pegaHandlerLutador();
        for (Lutador f : handler.getLutadores()) {
            lista.add(new SelectItem(f.getId_Lutador().toString(), f.getNome()));
        }
        return lista;
    }
Bem até aqui está ok, pois meu SelectOneMenu aparece com os "Lutadores" que estão no banco. Entanto estou com problema para pegar esse valor, ou id, do "lutador" selecionado e grava ele juntamento com o patrocinador no BD, visto que tenho no meu mapeamento e preciso de UM Patrocinador para cada Lutador, creio que o mapeamento no hibernate está certo, meu problema é que até consigo gravar o novo patrocinador, porém o valor selecionado do meu SelectOneMenu não é gravado junto. Como que posso fazer pra pegar esse valor? Eu ja tentei dar um Binding no SelectOneMenu e criar uma variavel tipo:
private HtmlSelectOneMenu lutadorSelecionado;
//E usar isso aqui na classe que salva o parocinador
int id=Interger.parseInt(lutadorSelecionado.getValue().ToString());
Lutador l = pegaHandlerLutador.getLutadores.get(id);
patrocinador.setLutador(l);
//algo desse tipo

Alguem tem alguma ideia de como poderia fazer de um jeito simples ?! ... Algum exemplo sobre isso perdido pela internet?!
Agradeço qualquer ajuda. Desde ja muito obrigado.

3 Respostas

V

Colega,

Tive que fazer algo semelhante ao que vc fez. Precisei usar um Converter

<h:selectOneMenu id="selectProjeto" value="#{orcamento.orcamento.projeto}"
									converter="projetoConverter"
									required="false">
									  <f:selectItems value="#{orcamento.listaProjetos}" />
									</h:selectOneMenu>

o converter

public class ProjetoConverter implements Converter {

	private Projeto projeto = null;
	private ProjetoService service = null;

	public ProjetoConverter() {
		service = ServiceFactory.getProjetoService();
		this.projeto = new Projeto();
	}

	@Override
	public Object getAsObject(FacesContext context, UIComponent component,
			String value) {
		try {

			if (value == null || value.equals("0")) {
				return null;
			}
			Integer id = new Integer(value);
			this.projeto.setId(id);
			this.projeto = service.procurarPorId(projeto);
			return projeto;
		} catch (Exception e) {
			//trate!
			return null;
		}
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component,
			Object value) {
		try {
			if (value == null) {
				return "0";
			}
			if (value instanceof Projeto) {
				Projeto aux = (Projeto) value;
				return aux.getId().toString();
			} else
				return "0";
		} catch (Exception e) {
			//trate!
			return "0";
		}

	}

}

no faces-config

<converter>
    	<converter-id>projetoConverter</converter-id>
    	<converter-class>com.mts.samds.converter.ProjetoConverter</converter-class>
    </converter>

Sua classe entidade precisa ter o hashcode e equals certinho.

Espero ter ajudado.

rponte

Não entendi bem o seu problema.
Será que o que você não está procurando é um entity converter?

Abraços.

W

Olá, obrigado pelas respostas rponte e valdair.mts.
Então, o que estou procurando não sei bem se seria um converter, mas o problema é o seguinte:
Tenho um objeto Lutador e um objeto Tecnico no banco de dados, com relação de Um pra Um entre os mesmos. Estou querendo adicionar um novo Tecnico, para isso preciso passar o nome do Lutador o qual aquele tecnico trabalha, no formulário para criar um novo Técnico uso um SelectOneMenu para mostrar os nomes dos Lutadores que estão no BD, até ai está ok, o problema é que eu não consigo pegar esse valor do SelectOneMenu, com o nome do Lutador, para criar corretamente o objeto.


Espero que tenha ficado mais claro.
[]´s

PS: Muito bom o blog que você me passou rponte, estou lendo, obrigado.

Criado 30 de junho de 2009
Ultima resposta 1 de jul. de 2009
Respostas 3
Participantes 3