Olá galera, estou desenvolvendo meu TCC usando JSF e JPA como arquitetura, porém estou com dúvidas se o que eu fiz está correto(acho provável que não -_-), portanto vou postar meu código aqui para que alguém analise e me diga o que corrigir:
telaCadastroCategoria.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="./template.xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core">
<ui:define name="Conteudo">
<h2>Cadastrar Categoria Serviço</h2>
<h:form>
<h:panelGrid columns="2">
<h:outputLabel styleClass="labelForm" value="Nome: " for="nome"/>
<h:inputText id="nome" value="#{categoriaServicoMB.categoriaServico.nomeCategoria}"/>
<h:commandButton value="Cadastrar" action="#{categoriaServicoMB.salvar}" />
</h:panelGrid>
<h2>Visualizar Categoria Serviço</h2>
<h:dataTable value="#{categoriaServicoMB.categorias}" headerClass="tabelaCabecalho " styleClass="tabelaDados" var="categoria" rowClasses="tabelaLinhaCorClara, tabelaLinhaCorEscura">
<h:column>
<f:facet name="header">
<h:outputText value="ID"/>
</f:facet>
<h:outputText value="#{categoria.idCategoriaServico}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Nome Categoria"/>
</f:facet>
<h:outputText value="#{categoria.nomeCategoria}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Editar"/>
</f:facet>
<h:commandLink value="Editar" action="telaEditaCategoria">
<f:setPropertyActionListener value="#{categoria.idCategoriaServico}" target="#{categoriaServicoMB.id}"/>
</h:commandLink>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Excluir"/>
</f:facet>
<h:commandLink value="Excluir" action="#{categoriaServicoMB.excluir}">
<f:setPropertyActionListener value="#{categoria.idCategoriaServico}" target="#{categoriaServicoMB.categoriaServico.idCategoriaServico}"/>
</h:commandLink>
</h:column>
</h:dataTable>
</h:form>
</ui:define>
</ui:composition>
1 - Para excluir/editar registros estou fazendo corretamente passando o id?
com.modelo.managedBean.CategoriaServicoMB
[code]
package com.modelo.managedBean;
import com.modelo.bean.CategoriaServico;
import com.modelo.dao.CategoriaServicoDAO;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
@ManagedBean
public class CategoriaServicoMB {
private Integer id;
private CategoriaServico categoriaServico;
private List<CategoriaServico> categorias = new ArrayList<CategoriaServico>();
public CategoriaServicoMB() {
categoriaServico = new CategoriaServico();
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
if (id != null) {
CategoriaServicoDAO categoriaDAO = new CategoriaServicoDAO();
categoriaServico = categoriaDAO.recuperarCategoriaServico(this.getId());
}
}
public CategoriaServico getCategoriaServico() {
return categoriaServico;
}
public void setCategoriaServico(CategoriaServico categoriaServico) {
this.categoriaServico = categoriaServico;
}
public String salvar() {
CategoriaServicoDAO categoriaDAO = new CategoriaServicoDAO();
if(categoriaDAO.inserirCategoriaServico(categoriaServico)){
return "sucessoOperacao";
} else {
return "falhaOperacao";
}
}
public String excluir() {
CategoriaServicoDAO categoriaDAO = new CategoriaServicoDAO();
categoriaServico = categoriaDAO.recuperarCategoriaServico(categoriaServico.getIdCategoriaServico());
categoriaDAO.excluirCategoriaServico(categoriaServico);
return "sucessoOperacao";
}
public String atualizar() {
CategoriaServicoDAO categoriaDAO = new CategoriaServicoDAO();
//categoriaServico = categoriaDAO.recuperarCategoriaServico(categoriaServico.getIdCategoriaServico());
categoriaDAO.atualizarCategoriaServico(categoriaServico);
return "sucessoOperacao";
}
public List<CategoriaServico> getCategorias() {
CategoriaServicoDAO categoriaDAO = new CategoriaServicoDAO();
categorias = categoriaDAO.listarCategoriaServico();
return categorias;
}
}
[/code]
2 - Percebo algo estranho aqui pois tenho que instanciar a cada método o CategoriaServicoDAO e o objeto instanciado não sofre nenhuma alteração, seria o caso de utilizar um método static?
com.modelo.bean.CategoriaServico
package com.modelo.bean;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@Entity
@Table(name="categoria_servicos")
public class CategoriaServico {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="id_categoria_servicos")
private int idCategoriaServico;
@Column(name="nome_categorias")
private String nomeCategoria;
// getter e setter
public String getNomeCategoria(){
return this.nomeCategoria;
}
public void setNomeCategoria(String nomeCategoria){
this.nomeCategoria = nomeCategoria;
}
public int getIdCategoriaServico() {
return idCategoriaServico;
}
public void setIdCategoriaServico(int idCategoriaServico) {
this.idCategoriaServico = idCategoriaServico;
}
}
3 - Meu bean com get/set somente. As regras de negócio vão aqui dentro ou dentro do managedBean? Isto não consegui entender mesmo "/
com.modelo.dao.CategoriaServicoDAO
package com.modelo.dao;
import com.modelo.bean.CategoriaServico;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;
public class CategoriaServicoDAO {
private EntityManagerFactory factory = null;
private EntityManager manager = null;
public CategoriaServicoDAO() {
factory = Persistence.createEntityManagerFactory("TurismoGuiadoPU");
manager = factory.createEntityManager();
}
public boolean inserirCategoriaServico(CategoriaServico categoriaServico) {
EntityTransaction transaction = manager.getTransaction();
try {
transaction.begin();
manager.persist(categoriaServico);
transaction.commit();
return true;
} catch (Exception e) {
transaction.rollback();
System.err.println("Erro: " + e.getMessage());
return false;
} finally {
manager.close();
}
}
public void excluirCategoriaServico(CategoriaServico categoriaServico){
EntityTransaction transaction = manager.getTransaction();
try {
transaction.begin();
manager.remove(categoriaServico);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
System.err.println("Erro: " + e.getMessage());
} finally {
manager.close();
}
}
public void atualizarCategoriaServico(CategoriaServico categoriaServico){
EntityTransaction transaction = manager.getTransaction();
try {
transaction.begin();
manager.merge(categoriaServico);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
System.err.println("Erro: " + e.getMessage());
} finally {
manager.close();
}
}
public CategoriaServico recuperarCategoriaServico(int idCategoriaServico){
EntityTransaction transaction = manager.getTransaction();
CategoriaServico categoriaServico = manager.find(CategoriaServico.class, idCategoriaServico);
return categoriaServico;
}
public List<CategoriaServico> listarCategoriaServico(){
EntityTransaction transaction = manager.getTransaction();
Query query = manager.createQuery("SELECT a FROM CategoriaServico a");
List<CategoriaServico> categoriasServico = query.getResultList();
return categoriasServico;
}
}
4 - O DAO seria isso mesmo? No caso teria que criar um DAO genérico para ser utilizado por todas as outras classes que sofrerão persistencia, certo?