I'm working on software and I'm having a headache to insert some related objects. It is inserting this object twice and the error is not visible. To see the whole project, follow the link from github: Complete Project .
The classes that are giving this problem are the incoming and outgoing transactions. But we are going to the entrance, then in the exit I turn:
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: entryControlle .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 input class: Complete .java
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 inputData.java :
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 input classController.java needs other classes to assist the write method in insertion and relationship. To view, follow the complete project at the beginning of this post.