E aí galera. To com um problemão, eu acho que é de lógica e até agora não consegui resolver, já faz 4 dias. Procurei em tudo quanto é lugar, implementei um monte de lógicas e nada resolveu. Resolvi postar aqui no forum então, se alguém puder ajudar fico muito grato.
Tenho duas classes categoria e produto. Uma categoria tem muitos produtos. Fiz uma view pra persistir meus produtos, nela há um selectOneMenu com uma lista de SelectItems de categorias. Por nada no mundo isso persiste no banco. Uma hora da mensagem de erro no EJB outra dá erro de conversor, e outras tantas dependendo das varias logicas que tentei implementar.
Essa é o trecho da minha pagina JSF<h:selectOneMenu value="#{produtocrtl.idCategoria}" >
<f:selectItems value="#{categoriacrtl.selectItemCategoria}"/>
</h:selectOneMenu>
public List<SelectItem> getSelectItemCategoria(){
List<SelectItem> lista = new ArrayList<SelectItem>();
List<Categoria> listaCategoria = getListaCategoria();
lista.add(new SelectItem(null, ""));
for(Categoria c : listaCategoria){
lista.add(new SelectItem(c.getIdCategoria(),c.getDescricao()));
}
return lista;
}
@Named(value="produtocrtl")
@SessionScoped
public class ProdutoCrtl implements Serializable{
@Inject
private ProdutoDao produtoDao;
@Inject
private CategoriaDao categoriaDao;
private Produtos produtos; //= new Produtos();
private Integer idCategoria;
public Produtos getProduto(){
if(produtos == null){
produtos = new Produtos();
}
return produtos;
}
public ProdutoCrtl(){
System.out.println(">>>>>>>>>>>>>Construtor produto foi chamado");
}
public List getListaProdutos(){
return produtoDao.findAll();
}
/**
* @return the produtos
*/
public Produtos getProdutos() {
System.out.println(">>>>>>>>>>get produtos foi chamado " + produtos.toString());
return produtos;
}
/**
* @param produtos the produtos to set
*/
public void setProdutos(Produtos produtos) {
this.produtos = produtos;
}
public void addProdutos(){
System.out.println(">>>>>addProdutos foi chamado" + produtos.getIdProdutos());
System.out.println(">>>>> " + produtos.toString() + " ### " + produtos.getNome() + " ### " + produtos.getDescricao() + " ### " + this.idCategoria);
Categoria categoria = categoriaDao.find(idCategoria);
produtos.setIdCategoria(categoria);
produtoDao.save(produtos);
if(produtos.getIdProdutos()>0){
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Novo cliente adicionado com sucesso"));
produtos.setIdProdutos(null);
produtos.setIdCategoria(null);
}else{
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Erro ao adicionar cliente"));
}
}
public void excluirProduto(){
try{
produtoDao.delete(produtos);
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Produto excluido com sucesso"));
}catch(Exception e){
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Erro ao excluir produto"));
}
}
/**
* @return the idCategoria
*/
public Integer getIdCategoria() {
return idCategoria;
}
/**
* @param idCategoria the idCategoria to set
*/
public void setIdCategoria(Integer idCategoria) {
this.idCategoria = idCategoria;
}
}
public Categoria find(Integer id) {
Query query = entityManager.createNamedQuery("Categoria.findByIdCategoria");
query.setParameter("idCategoria", id);
Categoria categoria = (Categoria) query.getSingleResult();
return categoria;
}
@Stateless
public class ProdutoDao {
@PersistenceContext(name = "ecommercePU")
private EntityManager entityManager;
public List findAll() {
Query query = entityManager.createNamedQuery("Produtos.findAll");
return query.getResultList();
}
public void save(Produtos produto) {
System.out.println(">>>>>>save produto foi chamado");
entityManager.persist(produto);
}
public void delete(Produtos produto) {
entityManager.remove(produto);
}
public void update(Produtos produto) {
entityManager.merge(produto);
}
}
@Entity
@Table(name = "Produtos")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Produtos.findAll", query = "SELECT p FROM Produtos p"),
@NamedQuery(name = "Produtos.findByIdProdutos", query = "SELECT p FROM Produtos p WHERE p.idProdutos = :idProdutos"),
@NamedQuery(name = "Produtos.findByNome", query = "SELECT p FROM Produtos p WHERE p.nome = :nome"),
@NamedQuery(name = "Produtos.findByPreco", query = "SELECT p FROM Produtos p WHERE p.preco = :preco"),
@NamedQuery(name = "Produtos.findByCategoria",query = "SELECT p FROM Produtos p WHERE p.idCategoria = :idCategoria")})
public class Produtos implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Basic(optional = false)
@NotNull
@Column(name = "idProdutos")
private Integer idProdutos;
@Size(max = 100)
@Column(name = "nome")
private String nome;
@Lob
@Size(max = 65535)
@Column(name = "descricao")
private String descricao;
// @Max(value=?) @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
@Column(name = "preco")
private BigDecimal preco;
@OneToMany(mappedBy = "idProdutos")
private List<PedidoItem> pedidoItemList;
@JoinColumn(name = "idCategoria", referencedColumnName = "idCategoria")
@ManyToOne
private Categoria idCategoria;
@Size(max=45)
@Column(name = "imagem")
private String imagem;
public Produtos() {
}
public Produtos(Integer idProdutos) {
this.idProdutos = idProdutos;
}
public Integer getIdProdutos() {
return idProdutos;
}
public void setIdProdutos(Integer idProdutos) {
this.idProdutos = idProdutos;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public BigDecimal getPreco() {
return preco;
}
public void setPreco(BigDecimal preco) {
this.preco = preco;
}
@XmlTransient
public List<PedidoItem> getPedidoItemList() {
return pedidoItemList;
}
public void setPedidoItemList(List<PedidoItem> pedidoItemList) {
this.pedidoItemList = pedidoItemList;
}
public Categoria getIdCategoria() {
return idCategoria;
}
public void setIdCategoria(Categoria idCategoria) {
this.idCategoria = idCategoria;
}
@Override
public int hashCode() {
int hash = 0;
hash += (idProdutos != null ? idProdutos.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Produtos)) {
return false;
}
Produtos other = (Produtos) object;
if ((this.idProdutos == null && other.idProdutos != null) || (this.idProdutos != null && !this.idProdutos.equals(other.idProdutos))) {
return false;
}
return true;
}
@Override
public String toString() {
return "br.ecommerce.model.Produtos[ idProdutos=" + idProdutos + " ]";
}
/**
* @return the imagem
*/
public String getImagem() {
return imagem;
}
/**
* @param imagem the imagem to set
*/
public void setImagem(String imagem) {
this.imagem = imagem;
}
}
