Olá a todos;
estou com dificuldade para fazer o método Salvar() e o formulário que envie os dados para as tabelas do banco de dados;
Tenho as tabelas: itens; itens_fornecedor; fornecedor
Tenho as classes Itens.java e Fornecedor.Java
Preciso fazer um relacionamento muitos para muitos.
Da maneira que esta eu acesso a pagina funcao_fornecedor.xhtml, ele lista os fornecedores cadastrados,
escolho a opção adicionar item ele me redireciona para a pagina adicionar_item_fornecedor.xhtml,
Carrega o nome do fornecedor e o form para inserir o nome do Produto a ser adicionado, até ai tudo bem,
O Problema começa quando peço para salvar, ele só salva na tabela Itens, e não salva na tabela de relacionamento itens_fornecedor.
Vi varios exemplos no google e o mais parecido com o que quero fazer é este aqui:
http://www.guj.com.br/java/256062-resolvido-dificuldade-para-salvar-muitos-para-muitos
Alguém pode me ajudar e me mostrar o que estou fazendo de errado?
Se alguém tiver um exemplo que já tenha utilizado, também ajuda.
Fornecedor.java
package modelo;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name = "fornecedor")
public class Fornecedor implements Serializable {
private static final long serialVersionUID = 2471765773806278661L;
@Id
@GeneratedValue
@Column(name = "cod_fornecedor")
private Integer cod_fornecedor;
@Column(name = "nomefantasia")
private String nomefantasia;
@Column(name = "razaosocial")
private String razaosocial;
@Column(name = "nomecontato")
private String nomecontato;
@Column(name = "cnpj")
private String cnpj;
@Column(name = "ie")
private String ie;
@Column(name = "cep")
private String cep;
@Column(name = "endereco")
private String endereco;
@Column(name = "numero")
private String numero;
@Column(name = "complemento")
private String complemento;
@Column(name = "bairro")
private String bairro;
@Column(name = "cidade")
private String cidade;
@Column(name = "uf")
private String uf;
@Column(name = "fone1")
private String fone1;
@Column(name = "fone2")
private String fone2;
@Column(name = "email")
private String email;
@Column(name = "status")
private boolean status;
@Column(name = "observacoes")
private String observacoes;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "itens_fornecedor", joinColumns = { @JoinColumn(name = "cod_fornecedor") }, inverseJoinColumns = { @JoinColumn(name = "cod_itens") })
private Set<Itens> itens = new HashSet<Itens>();
//Getters and Setters ....
Itens.java
package modelo;
import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name = "itens")
public class Itens implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name="cod_itens")
private Integer cod_itens;
@Column(name="nome")
private String nome;
@ManyToMany(mappedBy="itens", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
//Getters and Setters ....
DaoFactory.Java
package util;
import dao.FornecedorDAO;
import dao.FornecedorDAOImpl;
import dao.ItensDAO;
import dao.ItensDAOImpl;
public class DAOFactory {
public static FornecedorDAO criarFornecedorDAO() {
FornecedorDAOImpl fornecedorDAO = new FornecedorDAOImpl();
fornecedorDAO.setSession(HibernateUtil.getSessionFactory().getCurrentSession());
return fornecedorDAO;
}
public static ItensDAO criarItensDAO() {
ItensDAOImpl itensDAO = new ItensDAOImpl();
itensDAO.setSession(HibernateUtil.getSessionFactory().getCurrentSession());
return itensDAO;
}
}
ItensDAO.java
package dao;
import modelo.Itens;
public interface ItensDAO {
public void Salvar(Itens itens);
}
ItensDAOImpl.Java
package dao;
import modelo.Itens;
import org.hibernate.Session;
public class ItensDAOImpl implements ItensDAO {
private Session session;
public void setSession(Session session) {
this.session = session;
}
public void Salvar(Itens itens) {
this.session.save(itens);
}
}
Itens.RN
package modelo;
import util.DAOFactory;
import dao.ItensDAO;
public class ItensRN {
private ItensDAO itensDAO;
public ItensRN() {
this.itensDAO = DAOFactory.criarItensDAO();
}
public void Salvar(Itens itens) {
this.itensDAO.Salvar(itens);
}
}
ItensBean.java
package bean;
import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import modelo.Itens;
import modelo.ItensRN;
@ManagedBean(name = "itensBean")
@SessionScoped
public class ItensBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Itens itens = new Itens();
private String msg = "";
private List<Itens> listarItensFornecedor;
private List<Itens> pesquisarItensFornecedor;
public List<Itens> getPesquisarItensFornecedor() {
return pesquisarItensFornecedor;
}
public void setPesquisarItensFornecedor(
List<Itens> pesquisarItensFornecedor) {
this.pesquisarItensFornecedor = pesquisarItensFornecedor;
}
public String AdicionarItemFornecedor(){
return "adicionar_item_fornecedor";
}
public String Salvar() {
// Início valida campos que estiver em branco
FacesContext context = FacesContext.getCurrentInstance();
String nome = this.itens.getNome();
nome = nome.replace(" ", "");
if (nome.isEmpty()) {
FacesMessage facesMessage = new FacesMessage(
"O nome do produto deve ser Preenchido.");
context.addMessage(msg, facesMessage);
msg += msg;
}
if (msg != "") {
return msg;
} else {
// Fim valida campos que estiver em branco
ItensRN itensRN = new ItensRN();
itensRN.Salvar(this.itens);
FacesMessage facesMessage = new FacesMessage(
"Cadastrado Com sucesso!");
context.addMessage(null, facesMessage);
// Serve para resetar o formulário cadastro de cliente
this.itens = null;
return null;
}
}
public Itens getItens() {
return itens;
}
public void setItens(Itens itens) {
this.itens = itens;
}
}
funcao_fornecedor.xhtml
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Funcionalidades do Fornecedor</title>
</h:head>
<h:body>
<ui:composition template="../template/template_admin.xhtml">
<ui:define name="principalinterno">
</ui:define><!-- fim principal interno -->
<ui:define name="caixa_principal">
<p:panel header="FORNECEDORES">
<h:form id="listagem">
<p:dataTable id="datatable" var="fornecedor" value="#{fornecedorBean.listarFornecedor}"
sortBy="fornecedor.cod_fornecedor" sortOrder="DESCENDING"
widgetVar="fornecedorTable" style="width:795px; margin-left:-10px;" paginator="true"
paginatorPosition="bottom" rows="10" emptyMessage="Nenhum Cliente Encontrado!"
rowsPerPageTemplate="5,10,15,30,60" filteredValue="#{fornecedorBean.pesquisarFornecedor}"
>
<f:facet name="header">
<p:button value="Voltar" outcome="index.xhtml"/>
<p:commandButton value="Novo fornecedor" action="#{fornecedorBean.AdicionarNovoFornecedor}"/>
<h:outputText value="Pesquisar Fornecedor: " style="margin-left:280px;"/>
<p:inputText id="globalFilter" onkeyup="fornecedorTable.filter()" style="width:150px" filterPosition="left"/>
</f:facet>
<p:column id="colunaCodigo" filterBy="#{fornecedor.cod_fornecedor}" sortBy="#{fornecedor.cod_fornecedor}" filterStyle="display:none" style="width:15px; text-align:center;">
<f:facet name="header">
<h:outputText value="Cod."/>
</f:facet>
<h:outputText value="#{fornecedor.cod_fornecedor}" id="cod_fornecedor"/>
</p:column>
<p:column id="colunaCnpj" filterBy="#{fornecedor.cnpj}" filterStyle="display:none" style="width:100px; text-align:center;" >
<f:facet name="header">
<h:outputText value="CNPJ"/>
</f:facet>
<h:outputText value="#{fornecedor.cnpj}" id="cnpj"/>
</p:column>
<p:column id="colunaNomefantasia" filterBy="#{fornecedor.nomefantasia}" filterStyle="display:none" style="text-align:center;">
<f:facet name="header">
<h:outputText value="Nome Fantasia"/>
</f:facet>
<h:outputText value="#{fornecedor.nomefantasia}" id="nomefantasia"/>
</p:column>
<p:column id="colunaStatus" style="width:10px; text-align:center;">
<f:facet name="header">
<h:outputText value="Status" id="status"/>
</f:facet>
<p:commandLink action="#{fornecedorBean.AlterarStatus}" onclick="if(!confirm('Confirma a mudança de Status?')) return false;" update=":listagem">
<h:graphicImage library="imagem" name="#{fornecedor.status}.png" style="border:0;"/>
<f:setPropertyActionListener target="#{fornecedorBean.fornecedor}" value="#{fornecedor}"/>
</p:commandLink>
<h:outputText rendered="#{fornecedor.status == true}" value=" Ativo" />
<h:outputText rendered="#{fornecedor.status == false}" value=" Inativo" />
</p:column>
<p:column style="width:10px; text-align:center;" exportable="false" >
<f:facet name="header">
<h:outputText value="Editar"/>
</f:facet>
<h:commandLink id="datatable" action="#{fornecedorBean.AlterarFornecedor}" >
<h:graphicImage library="imagem" name="alterar.gif" style="border:0;"/>
<f:setPropertyActionListener target="#{fornecedorBean.fornecedor}" value="#{fornecedor}"/>
</h:commandLink>
</p:column>
<p:column id="colunaadicionaritem" style="width:10px; text-align:center;" exportable="false">
<f:facet name="header">
<h:outputText value="+ Item"/>
</f:facet>
<p:commandLink id="additem" action="#{itensFornecedorBean.AdicionarItemFornecedor}" >
<h:graphicImage library="imagem" name="icone_adicionar.png" style="border:0;"/>
<f:setPropertyActionListener target="#{fornecedorBean.fornecedor}" value="#{fornecedor}"/>
</p:commandLink>
</p:column>
<p:column id="colunaDetalhes" style="width:10px; text-align:center;" exportable="false">
<f:facet name="header">
<h:outputText value="Ver"/>
</f:facet>
<p:commandLink id="btdetalhes" action="#{fornecedorBean.DetalharFornecedor}" >
<h:graphicImage library="imagem" name="icone_detalhes2.png" style="border:0;"/>
<f:setPropertyActionListener target="#{fornecedorBean.fornecedor}" value="#{fornecedor}"/>
</p:commandLink>
</p:column>
</p:dataTable>
<h:panelGrid columns="2">
<p:panel header="Exportar Página Atual" style="width:200px; margin-left:-12px;">
<h:commandLink>
<p:graphicImage library="imagem" name="excel.png" style="border:none;" title="Exportar para Excel"/>
<p:dataExporter type="xls" target="datatable" encoding="iso-8859-1" fileName="relatorio" pageOnly="true" postProcessor="#{fornecedorBean.PrepararXLS}"/>
</h:commandLink>
<h:commandLink>
<p:graphicImage library="imagem" name="pdf.png" style="border:none;" title="Exportar para PDF" />
<p:dataExporter type="pdf" target="datatable" encoding="iso-8859-1" fileName="relatorio" pageOnly="true" preProcessor="#{fornecedorBean.PrepararPDF}"/>
</h:commandLink>
</p:panel>
<p:panel header="Exportar Todas as Páginas" style="width:200px;">
<h:commandLink>
<p:graphicImage library="imagem" name="excel.png" style="border:none;" title="Exportar para Excel"/>
<p:dataExporter type="xls" target="datatable" encoding="iso-8859-1" fileName="relatorio" postProcessor="#{fornecedorBean.PrepararXLS}" />
</h:commandLink>
<h:commandLink>
<p:graphicImage library="imagem" name="pdf.png" style="border:none;" title="Exportar para PDF"/>
<p:dataExporter type="pdf" target="datatable" encoding="iso-8859-1" fileName="relatorio" preProcessor="#{fornecedorBean.PrepararPDF}"/>
</h:commandLink>
</p:panel>
</h:panelGrid>
</h:form>
</p:panel>
</ui:define><!-- fim caixa principal -->
</ui:composition>
</h:body>
</html>
adicionar_produto_fornecedor.xhtml
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Cadastro</title>
</h:head>
<h:body>
<ui:composition template="../template/template_admin.xhtml">
<ui:define name="principalinterno">
</ui:define>
<!-- fim principal interno -->
<ui:define name="caixa_principal">
<div id="layout_caixa_principal">
<p:panel header="ADICIONAR PRODUTO AO FORNECEDOR">
<h:form id="edicao">
<p:panel id="panel"
style="border:none; width:680px; margin-left:20px;">
<h:panelGrid columns="1">
<div id="mensagemErro">
<p:messages
style="color:#F00; background-color:#FDD; border:#F60 1px solid; padding:3px; width:715px;
font-family:Verdana, Geneva, sans-serif; font-size:12px; margin: 0 auto;" />
</div>
</h:panelGrid>
<h:panelGrid columns="2">
<h:outputLabel value="Fornecedor:" />
<h:outputText id="fornecedor"
value="#{fornecedorBean.fornecedor.nomefantasia}" />
<h:outputLabel for="nome" value="Nome do Produto:" />
<p:inputText id="nome"
value="#{itensFornecedorBean.itensFornecedor.nome}"
required="true" requiredMessage="Digite o nome do produto."
size="30" maxlength="30" />
</h:panelGrid>
<br />
<!-- <p:button value="Voltar" outcome="funcao_cliente.xhtml" styleClass="btn_voltar_alterar_cadastro"/> -->
<p:commandButton id="btn_voltar" update="panel" value="Cadastrar"
action="#{itensFornecedorBean.Salvar}"
styleClass="btn_atualizar_funcionario" />
</p:panel>
</h:form>
<h:form id="form_voltar">
<p:commandButton id="btn" value="Voltar"
action="#{fornecedorBean.VoltarFornecedor}"
styleClass="btn_voltar_funcionario" />
</h:form>
<br />
</p:panel>
</div>
<!-- Fim cad_usuario -->
</ui:define>
<!-- fim caixa principal -->
</ui:composition>
</h:body>
</html>