Arquitetura MVC com JSF e JPA - Organizar

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?

Dentro do model.

No caso teria que criar um DAO genérico para ser utilizado por todas as outras classes que sofrerão persistencia, certo?

É uma das abordagens possiveis.

Qual seriam outras abordagens possíveis?

[quote=gRoOve][quote]

No caso teria que criar um DAO genérico para ser utilizado por todas as outras classes que sofrerão persistencia, certo?

É uma das abordagens possiveis.
[/quote]
Qual seriam outras abordagens possíveis?[/quote]

Muita gente opta por usar NamedQueries ao invés de DAO.