Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Adiciona uma nova linha.

Bom dia pessoal. Em um projeto pessoal, com base na aula, tenho um caso que apresenta o seguinte problema ao alterar:

Quando clico em "Gravar" ele insere uma nova linha.

No meu caso agr eu tenho um atributo ManyToOne. Não sei se é por isso, eu até acho que sim. Estou dando uma olhada nisso.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">

<ui:composition template="/templates/_template.xhtml">
    <ui:define name="titulo">
            Nova Movimentação
    </ui:define>
    <ui:define name="conteudo">
        <h:form>
            <h:messages id="messages" />
            <fieldset>
                <legend>Ativo</legend>
                <h:panelGrid columns="2">
                    <h:outputLabel value="Selecione o Ativo:" for="ativo" />
                    <h:selectOneMenu value="#{movimentacaoBean.ativoId}" id="ativo">
                        <f:selectItems value="#{movimentacaoBean.ativos}" var="ativo"
                            itemLabel="#{ativo.nome}" itemValue="#{ativo.id}" />
                    </h:selectOneMenu>
                    <h:commandLink value="Cadastrar novo ativo" action="ativo"
                        immediate="true" />
                </h:panelGrid>
            </fieldset>
            <fieldset>
                <legend>Movimentação</legend>
                <h:panelGrid columns="2">
                    <h:outputLabel value="Data movimentação:" for="dataMovimentacao" />
                    <h:inputText id="dataMovimentacao"
                        value="#{movimentacaoBean.movimentacao.dataMovimentacao.time}">
                        <f:convertDateTime pattern="dd/MM/yyyy"
                            timeZone="America/Sao_Paulo" />
                    </h:inputText>
                    <h:outputLabel value="Tipo Movimentação:" for="tipoMovimentacao" />
                    <h:selectOneMenu
                        value="#{movimentacaoBean.movimentacao.tipoMovimentacao}"
                        id="tipoMovimentacao">
                        <f:selectItems value="#{movimentacaoBean.tipoMovimentacoes}"
                            var="tipoMovimentacao" itemLabel="#{tipoMovimentacao}"
                            itemValue="#{tipoMovimentacao}" />
                    </h:selectOneMenu>
                    <h:outputLabel value="Quantidade:" for="quantidade" />
                    <h:inputText id="quantidade"
                        value="#{movimentacaoBean.movimentacao.quantidade}"
                        required="true" requiredMessage="Descrição Obrigatório">
                        <f:ajax event="blur" render="messages" />
                    </h:inputText>
                    <h:outputLabel value="Valor Unitário:" for="vlrUnitario" />
                    <h:inputText id="vlrUnitario"
                        value="#{movimentacaoBean.movimentacao.vlrUnitario}"
                        required="true" requiredMessage="Descrição Obrigatório">
                        <f:ajax event="blur" render="messages" />
                    </h:inputText>
                </h:panelGrid>
            </fieldset>
            <h:commandButton value="Gravar" action="#{movimentacaoBean.gravar}">
                <f:ajax execute="@form"
                    render="@form :formTabelaMovimentacoes:tabelaMovimentacoes" />
            </h:commandButton>
        </h:form>

        <h:form id="formTabelaMovimentacoes">
            <h:dataTable value="#{movimentacaoBean.movimentacoes}"
                var="movimentacao" id="tabelaMovimentacoes">
                <h:column>
                    <f:facet name="header">Nome Ativo</f:facet>
                    <h:outputText value="#{movimentacao.ativo.nome}" />
                </h:column>
                <h:column>
                    <f:facet name="header">Data Movimentação</f:facet>
                    <h:outputText value="#{movimentacao.dataMovimentacao.time}">
                        <f:convertDateTime pattern="dd/MM/yyyy"
                            timeZone="America/Sao_Paulo" />
                    </h:outputText>
                </h:column>
                <h:column>
                    <f:facet name="header">Tipo Movimentação</f:facet>
                    <h:outputText value="#{movimentacao.tipoMovimentacao}" />
                </h:column>
                <h:column>
                    <f:facet name="header">Quantidade</f:facet>
                    <h:outputText value="#{movimentacao.quantidade}" />
                </h:column>
                <h:column>
                    <f:facet name="header">Valor Unitário</f:facet>
                    <h:outputText value="#{movimentacao.vlrUnitario}">
                        <f:convertNumber type="currency" pattern="R$ #0.00"
                            currencySymbol="R$" locale="pt_BR" />
                    </h:outputText>
                </h:column>
                <h:column>
                    <f:facet name="header">Valor Total</f:facet>
                    <h:outputText value="#{movimentacao.vlrTotal}">
                        <f:convertNumber type="currency" pattern="R$ #0.00"
                            currencySymbol="R$" locale="pt_BR" />
                    </h:outputText>
                </h:column>
                <h:column>
                    <f:facet name="header">Alterar</f:facet>
                    <h:commandLink value="alterar"
                        action="#{movimentacaoBean.carregar(movimentacao)}" />
                </h:column>
                <h:column>
                    <f:facet name="header">Remover</f:facet>
                    <h:commandLink value="remover"
                        action="#{movimentacaoBean.remover(movimentacao)}" />
                </h:column>
            </h:dataTable>
        </h:form>
    </ui:define>
    <ui:define name="texto">
        Cadastro de Movimentação
    </ui:define>
</ui:composition>
</html>
2 respostas
package br.com.gustavo.financas.bean;

import java.util.List;

import javax.faces.bean.ManagedBean;

import br.com.gustavo.financas.dao.DAO;
import br.com.gustavo.financas.enuns.TipoMovimentacao;
import br.com.gustavo.financas.modelo.Ativo;
import br.com.gustavo.financas.modelo.Movimentacao;

@ManagedBean
public class MovimentacaoBean {

    private Movimentacao movimentacao = new Movimentacao();
    private Integer ativoId;

    public Movimentacao getMovimentacao() {
        return movimentacao;
    }

    public Integer getAtivoId() {
        return ativoId;
    }

    public void setAtivoId(Integer ativoId) {
        this.ativoId = ativoId;
    }

    public List<Ativo> getAtivos() {
        return new DAO<Ativo>(Ativo.class).listaTodos();
    }

    public List<Movimentacao> getMovimentacoes() {
        return new DAO<Movimentacao>(Movimentacao.class).listaTodos();
    }

    public void gravarAtivo() {
        Ativo ativo = new DAO<Ativo>(Ativo.class).buscaPorId(this.ativoId);
        this.movimentacao.setAtivo(ativo);
    }

    public TipoMovimentacao[] getTipoMovimentacoes() {
        return TipoMovimentacao.values();

    }

    public void gravar() {

        if (movimentacao.getId() == null) {
            gravarAtivo();
            this.movimentacao.setVlrTotal();
            new DAO<Movimentacao>(Movimentacao.class).adiciona(this.movimentacao);

        } else {
            gravarAtivo();
            this.movimentacao.setVlrTotal();
            new DAO<Movimentacao>(Movimentacao.class).atualiza(this.movimentacao);
        }

        this.movimentacao = new Movimentacao();
    }

    public void remover(Movimentacao movimentacao) {
        new DAO<Movimentacao>(Movimentacao.class).remove(movimentacao);
    }

    public void carregar(Movimentacao movimentacao) {
        this.movimentacao = movimentacao;
    }
}
package br.com.gustavo.financas.modelo;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Calendar;

import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.com.gustavo.financas.enuns.TipoMovimentacao;

@Entity
public class Movimentacao implements Serializable {
    private static final long serialVersionUID = 5263116871233975788L;

    @Id
    @GeneratedValue
    private Integer id;

    @Enumerated(EnumType.STRING)
    private TipoMovimentacao tipoMovimentacao;

    @Temporal(TemporalType.DATE)
    private Calendar dataMovimentacao = Calendar.getInstance();

    private Integer quantidade;
    private BigDecimal vlrUnitario;
    private BigDecimal vlrTotal;

    @ManyToOne
    @JoinColumn(name = "ativo_id")
    private Ativo ativo;

    public Integer getId() {
        return id;
    }

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

    public TipoMovimentacao getTipoMovimentacao() {
        return tipoMovimentacao;
    }

    public void setTipoMovimentacao(TipoMovimentacao tipoMovimentacao) {
        this.tipoMovimentacao = tipoMovimentacao;
    }

    public Calendar getDataMovimentacao() {
        return dataMovimentacao;
    }

    public void setDataMovimentacao(Calendar dataMovimentacao) {
        this.dataMovimentacao = dataMovimentacao;
    }

    public Integer getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(Integer quantidade) {
        this.quantidade = quantidade;
    }

    public BigDecimal getVlrUnitario() {
        return vlrUnitario;
    }

    public void setVlrUnitario(BigDecimal vlrUnitario) {
        this.vlrUnitario = vlrUnitario;
    }

    public BigDecimal getVlrTotal() {
        return vlrTotal;
    }

    public void setVlrTotal() {
        this.vlrTotal = this.vlrUnitario.multiply(new BigDecimal(this.quantidade));
    }

    public Ativo getAtivo() {
        return ativo;
    }

    public void setAtivo(Ativo ativo) {
        this.ativo = ativo;
    }

}
solução

Bom dia.

Coloquei a anotação @ViewScoped que eu não estava usando pq até então, achei que não ia precisar, e assim funcionou sem precisar colocar e outras coisas que vi nos foruns.