@OneToMany dando erro - JSF+Hibernate+PrimeFaces [RESOLVIDO]

Salve galera, como vão?
Galera, to desenvolvendo um sistema com JSF2+Hibernate+PrimeFaces, onde tenho duas classes:
InstituicaoBean

[code]@Entity
@Table(name = “TBInstituicao”)
public class InstituicaoBean implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idInstituicao", nullable = false)
private Integer idInstituicao; 
@Column(name = "nomeInstituicao", nullable = false, length = 50)
private String nomeInstituicao; 
@Column(name = "enderecoInstituicao", nullable = false, length = 50)
private String enderecoInstituicao;
@Column(name = "diretorInstituicao", length = 50)
private String diretorInstituicao;
@Column(name = "telefoneInstituicao", length = 15)
private String telefoneInstituicao;
@OneToMany(mappedBy = "instituicaoBean")
private List<CategoriaEnsinoBean> categoriasEnsino;[/code]

E CategoriaEnsinoBean

[code]@Entity
@Table(name = “TBCategoriaEnsino”)
public class CategoriaEnsinoBean implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idCategoriaEnsino")
private Integer idCategoriaEnsino;
@Column(name = "descricaoCategoria", nullable = false, length = 30)
private String descricaoCategoria;
@Column(name = "quantidadeAlunos", nullable = false)
private Integer quantidadeALunos;
@ManyToOne
@JoinColumn(name = "FK_idInstituicao", nullable = false)
private InstituicaoBean instituicaoBean;[/code]

O meu problema é o seguinte: nao consigo salvar categorias de ensino no banco!
Essas sao minhas outras classes:

InstituicaoMB:

[code]@ManagedBean
@RequestScoped
public class InstituicaoMB {

private String idInstituicao;
private String nomeInstituicao;
private String enderecoInstituicao;
private String diretorInstituicao;
private String telefoneInstituicao;
private InstituicaoBean instituicaoBean;[/code]

CategoriaEnsinoMB:

[code]@ManagedBean
@RequestScoped
public class CategoriaEnsinoMB {

private String idCategoriaEnsino;
private String descricaoCategoria;
private String quantidadeAlunos;
private String instituicaoBean;[/code]

E o meu xhtml:

<h:form id="formulario"> <p:growl id="alertas" /> <h:panelGrid columns="2"> <p:outputLabel value="Instituicao: " styleClass="labels"/> <p:selectOneMenu id="slcInstituicoes" value="#{instituicaoMB.instituicaoBean}" styleClass="input-big"> <f:selectItems value="#{instituicaoMB.exibirTodasInstituicoes()}" /> </p:selectOneMenu> <p:outputLabel value="Faixa Etaria: " styleClass="labels" /> <p:selectOneMenu id="slcFaixaEtaria" value="#{categoriaEnsinoMB.descricaoCategoria}" styleClass="input-big"> <f:selectItem itemValue="Educacao Infantil" itemLabel="Educacao Infatil" /> <f:selectItem itemValue="Ensino Fundamental" itemLabel="Ensino Fundamental" /> <f:selectItem itemValue="Ensino Medio" itemLabel="Ensino Medio" /> </p:selectOneMenu> <p:outputLabel value="Quantidade de Alunos:" styleClass="labels" /> <p:inputText id="txtQuantidadeAlunos" value="#{categoriaEnsinoMB.quantidadeAlunos}" styleClass="input-small" /> <p:commandButton value="Salvar" id="btnSalvar" action="#{instituicaoMB.salvarCategoriaEnsino()}" update=":painel"/> <p:commandButton value="Limpar" /> </h:form>

A idéia aqui é selecionar no selectOneMenu o nome da instituicao, depois no outro a faixa etária, e no inputText o numero de alunos por faixa etária.
Após isso, ao clicar em “Salvar”, ele salvaria a(s) faixa(s) etária(s) para aquela instituicao.

Como eu poderia estar passando os atributos para os ManagedBeans fazerem a persistencia?

você criou o conversor para a classe de persistencia do seu combo? criou os metodos equals, hashCode e toString na classe de persistencia para que o conversor funcione?

após a criação deles, você precisa incluir a propriedade converter no seu selectOneMenu apontando para seu conversor

Para visualizar a falta do conversor, inclua um <p:messages autoUpdate=“true”/> na sua pagina, isso irá mostrar as mensagens não logadas no servidor na sua tela.

Poderia me dar um exemplo?

Na sua classe de persistencia, que dá origem ao selectOneMenu, você precisa incluir os metodos equals, hashCode e toString, como abaixo (se estiver usando netbeans, ele gera o equals e hachCode pra vc):


<< minha classe de persistencia DlvTipoCardapio >>>
.....
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 71 * hash + this.idTipoCardapio;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final DlvTipoCardapio other = (DlvTipoCardapio) obj;
        if (this.idTipoCardapio != other.idTipoCardapio) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {  
            return (idTipoCardapio + ":");
    }

o Código do conversor:


@FacesConverter(value="tipoCardapioConversor", forClass=DlvTipoCardapio.class)  
public class DlvTipoCardapioConversor implements Converter{


    private static final long serialVersionUID = 1L;
    public SessionFactory sf = getSessionFactory();
    public Session session = sf.openSession();

  
    @Override  
    public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
        System.out.println("DlvTipoCardapioConversor.getAsObject - value: " + value);
        Integer idTipo; 
        if (value == null || "".equals(value)) {
            return null;
        }
        
        // pega o parametro do valor recebido
        String[] tokens = value.split(":");
        String param = tokens[0];
        // transforma o string do parametro em inteiro
        idTipo = Integer.parseInt(param);
        
        if(param != null) {  
            return session.get(DlvTipoCardapio.class, idTipo);  
        }  
        return null;  
    }  
  
    @Override  
    public String getAsString(FacesContext context, UIComponent component, Object object) throws ConverterException {  
        if(object != null && object instanceof DlvTipoCardapio) {  
            return ((DlvTipoCardapio)object).toString();  
        }  
        return null;  
    }  
}

e na pagina que usa o combo, fica +/- assim:

    <h:body style="font-family: arial;">
        <f:view>
            <h:form id="formConsulta">
                <div align="center">
                <br/>
                    <h:panelGrid columns="2" cellpadding="5">  
                        <h:outputLabel style="font-size: small" for="cardapio" value="Cardapio" />
                        <p:inputText size="9" style="font-size: small" value="#{cardapiosBean.nomeCardapio}"   
                                id="cardapio" label="cardapio" />  

                        <h:outputLabel style="font-size: small" for="tipoCardapio" value="tipoCardapio:" />  
                        <p:selectOneMenu required="true" style="font-size: small" value="#{cardapiosBean.tipoCardapio}" 
                                         id="tipoCardapio" label="tipoCardapio" converter="tipoCardapioConversor">
                            <f:selectItem itemValue="" itemLabel="--Selecione--"/>
                            <f:selectItems value="#{cardapiosBean.tipoCardapioList}" var="tipo" itemLabel="#{tipo.descricao}" itemValue="#{tipo}"/>
                        </p:selectOneMenu>
                        
                        <p:commandButton id="submitButton" icon="ui-icon-search" value="pesquisar" ajax="true"
                                         update=":formCardapio:tabelaCardapios" oncomplete="dlg.hide();" action="#{cardapiosBean.listCardapios}">
                            <f:setPropertyActionListener target="#{cardapiosBean.empresa}" value="#{loginBean.empresa}"/>
                        </p:commandButton>
                        <p:commandButton id="cancelButton" icon="ui-icon-close" value="cancelar" ajax="true" oncomplete="dlg.hide();">
                        </p:commandButton>
                    </h:panelGrid>
                </div>
            </h:form>
        </f:view>
    </h:body>

Espero ter ajudado.

Entendii!
Mas, ali na linha 12 do xhtml, no value="#{cardapioBean.tipoCardapio}",
qual é o tipo de variável tipoCardapio?

DEU CERTOOOO!!
siesler, Deus te abençoe! rsrs
Era só erro de conversão mesmo! Não estava salvando porque o objeto ia nulo para o ManagedBean.
Depois que fiz o conversor, ele buscava para mim o objeto a partir dos dados do selectOneMenu.
Deu tudo certo!

Obrigado siesler!

[]'s

fico feliz em ajudar

Abraço