JSF and JPA with Eclipselink: Inserting element twice in the database

Asked

Viewed 81 times

1

I’m working on software and I’m having a certain headache to insert some related objects. It is inserting this object twice and the error is not viewable. To see the whole project, follow github link: Projeto Completo.

The classes that are giving this problem, are the incoming and outgoing transactions. But we go in, then on exit I turn around:

My view: new-entry.xhtml

 <h:form>
   <div class="clearfix m-t-1">
     <h:outputLabel for="quantidade" value="Quantidade" rendered="true"/>
     <h:inputText value="#{entradaController.entrada.quantidade}" id="quantidade" class="form-control" pt:placeholder="Digite a quantidade"/>
   </div>

 <div class="clearfix m-t-1">
   <h:outputLabel for="fornecedor" value="Fornecedor"/>
   <h:selectOneMenu id="fornecedor" value="#{entradaController.idFornecedorEntrada}" class="form-control custom-select">
     <f:selectItem itemLabel="Selecionar o Fornecedor" itemValue="#{null}" />
     <f:selectItems value="#{entradaController.fornecedores}" var="fornecedor" itemLabel="#{fornecedor.nome}" itemValue="#{fornecedor.id}" />
   </h:selectOneMenu>
 </div>

 <div class="clearfix m-t-1">
   <h:outputLabel for="produto" value="Produto"/>
   <h:selectOneMenu id="produto" value="#{entradaController.idProdutoEntrada}" class="form-control custom-select">
     <f:selectItem itemLabel="Selecione o produto" itemValue="#{null}" />
     <f:selectItems value="#{entradaController.produtos}" var="produto" itemLabel="#{produto.nome}" itemValue="#{produto.id}" />
   </h:selectOneMenu>
 </div>

 <div class="clearfix m-t-1">
   <h:outputLabel for="almoxarifado" value="Almoxarifado"/>
   <h:selectOneMenu id="almoxarifado" value="#{entradaController.idAlmoxarifadoEntrada}" class="form-control custom-select">
     <f:selectItem itemLabel="Selecione o Almoxarifado" itemValue="#{null}" />
     <f:selectItems value="#{entradaController.almoxarifados}" var="amoxarifado" itemLabel="#{amoxarifado.cidade} / #{amoxarifado.estado}" itemValue="#{amoxarifado.id}" />
   </h:selectOneMenu>
 </div>


 <div class="clearfix m-t-1">
   <h:commandButton action="#{entradaController.gravar()}" value="Gravar Entrada" class="btn btn-success form-control" />
 </div>

 </h:form>

Just below, my control: entradaControlle.java

public String gravar() {

        this.fornecedorExterno = this.fornecedorExternoDAO.buscaPorId(idFornecedorEntrada);
        this.entrada.setFornecedorExterno(fornecedorExterno);

        this.almoxarifado = this.almoxarifadoDAO.buscaPorId(idAlmoxarifadoEntrada);
        this.produto = this.produtoDAO.buscaPorId(idProdutoEntrada);
        this.produtoAlmoxarifado = produtoAlmoxarifadoDAO.busca(
                this.idAlmoxarifadoEntrada,
                this.idProdutoEntrada
        );
        this.produtoAlmoxarifado.setAlmoxarifado(this.almoxarifado);
        this.produtoAlmoxarifado.setProduto(this.produto);
        this.produtoAlmoxarifado.setQuantidade(0);
        this.produtoAlmoxarifadoDAO.add(this.produtoAlmoxarifado);

        produtoAlmoxarifado.addEntrada(entrada);
        produtoAlmoxarifadoDAO.update(produtoAlmoxarifado);
        entradaDAO.add(entrada);

        this.entradas = this.entradaDAO.getList();

        return "entrada?faces-redirect=true";
}

My entry class: Input.java complete

package br.com.loogix.model;

import java.io.Serializable;
import java.time.LocalDate;
import java.util.Objects;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author thiago
 */
@Entity
@Table (name = "entrada")
public class Entrada implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Temporal(TemporalType.TIMESTAMP)
    private LocalDate data;
    private Integer quantidade;

    @ManyToOne
    @JoinColumn (name = "id_fornecedor")
    private FornecedorExterno fornecedorExterno;

    @ManyToOne
    @JoinColumn (name = "id_produto_almoxarifado")
    private ProdutoAlmoxarifado produtoAlmoxarifado;

    public LocalDate getData() {
        return data;
    }

    public void setData(LocalDate data) {
        this.data = data;
    }

    public Integer getQuantidade() {
        return quantidade;
    }

    public String getDataFormatada() {
        return this.data.toString();
    }

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

    public FornecedorExterno getFornecedorExterno() {
        return fornecedorExterno;
    }

    public void setFornecedorExterno(FornecedorExterno fornecedorExterno) {
        this.fornecedorExterno = fornecedorExterno;
    }

    public ProdutoAlmoxarifado getProdutoAlmoxarifado() {
        return produtoAlmoxarifado;
    }

    public void setProdutoAlmoxarifado(ProdutoAlmoxarifado produtoAlmoxarifado) {
        this.produtoAlmoxarifado = produtoAlmoxarifado;
    }

    public Long getId() {
        return id;
    }

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

    @Override
    public String toString() {
        return "Entrada{" + "id=" + id + ", data=" + data + ", quantidade=" + quantidade + ", fornecedorExterno=" + fornecedorExterno + '}';
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 97 * hash + Objects.hashCode(this.id);
        return hash;
    }

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




}

My class java. complete:

package br.com.loogix.dao;

import br.com.loogix.model.Entrada;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

@Stateless
public class EntradaDAO implements Serializable {

    private static final long serialVersionUID = 1L;

    private GenericDAO<Entrada> dao;

    @PersistenceContext
    EntityManager em;

    @PostConstruct
    public void init() {
        this.dao = new GenericDAO<Entrada>(this.em);
    }

    public void add(Entrada entrada) {
       this.dao.add(entrada);
    }

    public void update(Entrada entrada) {
        this.dao.update(entrada);
    }

    public void delete(Entrada entrada) {
        entrada = this.em.merge(entrada);
        this.dao.delete(entrada);
    }

    public List<Entrada> getList() {
        Query q = em.createQuery("select e from Entrada e");
        return q.getResultList();
    }

    public Long getSize() {
        TypedQuery<Long> q = em.createQuery("select count(e.id) from Entrada e", Long.class);
        return q.getSingleResult();
    }

}

The incoming classController.java needs other classes to assist the record method in the insertion and relationship. To view, follow complete project at the beginning of this post.

  • Here is a very stupid and innocent question: have you ever tried to put a breakpoint at the beginning of the method gravar()? I believe the form is being submitted more than once.

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.