1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Erro de validação referente a objeto relacional ManytoOne

Olá pessoal, estou fazendo um cadastro e quando tento salvar, dá um erro de validação (valor não válido). Eu tenho uma entidade Impressoras e outra Leitura onde Leitura tem relacionamento @ManyToOne.

Na tela de cadastro, criei um selectOneMenu para exibir e selecionar a impressora que será relacionada a Leitura, onde itemLabel representa o número de série e itemValue é o ID. O atributo itemValue="#{impressora.id}", parece estar correto, pois no código fonte exibe os valores corretos. Se eu trocar o selectOneMenu por inputText e atribuir o value="#{cadastroLeituraBean.leitura.impressora}", e digitar um ID válido, o cadastro funciona.

Segue abaixo as classes.

O projeto também está disponível no Bitbucket https://bitbucket.org/olintho/impressoras.git

Thanks a lot.

Impressoras.Java

package br.com.orei.model.entities;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "impressoras")
public class Impressoras implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "num_serie", length = 40, nullable = false)
    private String numeroSerie;

    @Column(length = 40, nullable = false)
    private String marca;

    @Column(length = 40)
    private String modelo;

    @Column(length = 50)
    private String local;

    @Temporal(TemporalType.DATE)
    @Column(name = "data_cadastro", nullable = false)
    private Date dataCadastro;

    @Enumerated(EnumType.STRING)
    @Column(name = "status_impressora", nullable = false, length = 40)
    private Status status;

    // Getters and Setters
    public Long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getNumeroSerie() {
        return numeroSerie;
    }

    public void setNumeroSerie(String numeroSerie) {
        this.numeroSerie = numeroSerie;
    }

    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    public String getLocal() {
        return local;
    }

    public void setLocal(String local) {
        this.local = local;
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (int) (id ^ (id >>> 32));
        return result;
    }

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

Leitura.Java

package br.com.orei.model.entities;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "leitura")
public class Leitura implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
//    @JoinColumn(name = "impressora_id")
    private Impressoras impressora;

    @Temporal(TemporalType.DATE)
    @Column(name = "data_leitura", nullable = false)
    private Date dataLeitura;

    @Column(name = "valor_leitura", nullable = false)
    private double valorLeitura;

    // Getters and Setters
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Impressoras getImpressora() {
        return impressora;
    }

    public void setImpressora(Impressoras impressora) {
        this.impressora = impressora;
    }

    public Date getDataLeitura() {
        return dataLeitura;
    }

    public void setDataLeitura(Date dataLeitura) {
        this.dataLeitura = dataLeitura;
    }

    public double getValorLeitura() {
        return valorLeitura;
    }

    public void setValorLeitura(double valorLeitura) {
        this.valorLeitura = valorLeitura;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Leitura other = (Leitura) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }
}

CadastroLeituraBean.java

package br.com.orei.controller;

import java.io.Serializable;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import br.com.orei.model.entities.Impressoras;
import br.com.orei.model.entities.Leitura;
import br.com.orei.persistence.ImpressorasRepository;
import br.com.orei.persistence.JpaUtil;
import br.com.orei.persistence.Leituras;
import br.com.orei.service.CadastroLeituras;
import br.com.orei.service.NegocioExcpetion;

@ManagedBean
@ViewScoped
public class CadastroLeituraBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private Leitura leitura = new Leitura();
    private List<Impressoras> todasImpressoras;

    public void prepararCadastro() {
        EntityManager manager = JpaUtil.geEntityManager();

        try {
            ImpressorasRepository impressoras = new ImpressorasRepository(manager);
            this.todasImpressoras = impressoras.todas();
        } finally {
            manager.close();
        }
    }

    public void salvar() {

        EntityManager manager = JpaUtil.geEntityManager();
        EntityTransaction trx = manager.getTransaction();
        FacesContext context = FacesContext.getCurrentInstance();

        try {
            trx.begin();
            CadastroLeituras cadastro = new CadastroLeituras(new Leituras(manager));
            cadastro.salvar(this.leitura);
            this.leitura = new Leitura();
            context.addMessage(null, new FacesMessage("Leitura salva com sucesso!"));
            trx.commit();
        } catch (NegocioExcpetion e) {
            trx.rollback();
            FacesMessage mensagem = new FacesMessage(e.getMessage());
            mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
            context.addMessage(null, mensagem);
        }
    }

    public List<Impressoras> getTodasImpressoras(){
        return this.todasImpressoras;
    }

    public Leitura getLeitura() {
        return leitura;
    }

    public void setLeitura(Leitura leitura) {
        this.leitura = leitura;
    }

}

CadastroLeituras.xhtml

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html>
<ui:composition template="/WEB-INF/templates/Layout.xhtml" xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
    <f:metadata>
        <f:viewAction action="#{cadastroLeituraBean.prepararCadastro}"></f:viewAction>
    </f:metadata>

    <ui:define name="titulo"> Cadastro de leituras</ui:define>

    <ui:define name="corpo">
        <h1>Cadastro de leituras</h1>

        <h:form>
            <h:messages showDetail="false" showSummary="true" />

            <h:panelGrid columns="2">
                <h:outputLabel value="ImpressoraID" />
                <h:selectOneMenu value="#{cadastroLeituraBean.leitura.impressora}" label="ImpressoraID">
                    <f:selectItem itemLabel="Selecione" noSelectionOption="true" />
                    <f:selectItems value="#{cadastroLeituraBean.todasImpressoras}" var="impressora" itemValue="#{impressora.id}"
                        itemLabel="#{impressora.numeroSerie}" />
                </h:selectOneMenu>
                <ui:remove>
                    <h:outputLabel value="Impressora" />
                    <h:inputText value="#{cadastroLeituraBean.leitura.impressora}" label="ImpressoraID" />
                </ui:remove>

                <h:outputLabel value="Valor da Leitura" />
                <h:inputText size="12" value="#{cadastroLeituraBean.leitura.valorLeitura}" label="Valor da Leitura">
                    <f:convertNumber locale="pt_BR" maxFractionDigits="2" minFractionDigits="0" />
                </h:inputText>

                <h:outputLabel value="Data da Leitura" />
                <h:inputText size="12" value="#{cadastroLeituraBean.leitura.dataLeitura}" label="Data de Leitura">
                    <f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo" />
                </h:inputText>

                <h:outputLabel />
                <h:commandButton value="Salvar" action="#{cadastroLeituraBean.salvar}" />
            </h:panelGrid>

        </h:form>
    </ui:define>

</ui:composition>

ImpressoraConverter.Java

package br.com.orei.converter;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.persistence.EntityManager;

import br.com.orei.model.entities.Impressora;
import br.com.orei.persistence.JpaUtil;
import br.com.orei.repository.Impressoras;

@FacesConverter(forClass = Impressora.class)
public class ImpressoraConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        Impressora retorno = null;
        EntityManager manager = JpaUtil.geEntityManager();
        System.out.println("getAsObject");
        try {
            if (value != null && !"".equals(value)){
                Impressoras impressoras = new Impressoras(manager);
                retorno = impressoras.porId(new Long(value));
            }
            return retorno;

        } finally{
            manager.close();

        }
    }

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

        System.out.println("getAsString");
        if (value != null){
            return ((Impressora) value).getId().toString();
        }
        return null;
    }

}
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jsf jpa hibernate ou faça a sua própria pergunta.