[RESOLVIDO] JBoss Tools+Richfaces+Refresh

Olá,

Estou montando um simples cadastro de empresa usando Richfaces.
Eu iniciei o projeto clicando em “Java EE Web Project” na central do JBoss e ele já montou a estrutura do projeto, com um cadastro de Membros.
Seguindo o exemplo criado, criei uma classe (Entity) chamada Empresa, uma classe para Serviços chamada EmpresaService e anotei ela como @Stateless.
Nesta classe EmpresaService eu tenho os métodos salvar, excluir e getEmpresa.

import gmantovani2005.webproject.model.Empresa;

import java.util.Date;
import java.util.logging.Logger;

import javax.ejb.Stateless;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.persistence.EntityManager;

@Stateless
public class EmpresaService {
	
	@Inject
	private Logger log;
	@Inject
	private EntityManager em;
	@Inject
	private Event<Empresa> empresaEventSrc;
	
	public void salvar(Empresa empresa) throws Exception {
		
		Date data = new Date();
		empresa.setDataAlteracao(data);
		
		if (empresa.getId() == null) {
			log.info("Salvando registro " + empresa.getNome());
			empresa.setAtivo(true);
			empresa.setDataCadastro(data);
			em.persist(empresa);
		} else {
			log.info("Alterando registro " + empresa.getNome() + " com ID " + empresa.getId());
			em.refresh(empresa);
		}
		
		empresaEventSrc.fire(empresa);
	}
	
	public void excluir(Empresa empresa) throws Exception {
		log.info("Excluindo registro " + empresa.getNome() + " com ID " + empresa.getId());
		Empresa aux = em.merge(empresa);
		em.remove(aux);
		empresaEventSrc.fire(empresa);
	}
	
	public Empresa getEmpresa(Long id) {
		Empresa empresa = em.find(Empresa.class, id);
		return empresa;
	}

}

Também criei uma classe de “controller” para a empresa, com a anotação @Model.
Aqui eu criei os métodos que são chamados pela página JSF.

import gmantovani2005.webproject.model.Empresa;
import gmantovani2005.webproject.service.EmpresaService;

import javax.annotation.PostConstruct;
import javax.enterprise.inject.Model;
import javax.enterprise.inject.Produces;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

@Model
public class EmpresaController {

	@Inject
	private FacesContext facesContext;
	
	@Inject
	private EmpresaService empresaService;
	
	private Empresa empresa;
	
	private Long id;

	public void salvar() {
		try {
			empresaService.salvar(empresa);
			facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Salvo!", "Empresa Salva com Sucesso!"));
			initEmpresa();
		} catch (Exception e) {
			facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Erro ao Salvar Empresa!"));
		}
	}
	
	public void excluir() {
		try {
			Empresa emp = empresaService.getEmpresa(id);
			empresaService.excluir(emp);
			facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Excluída!", "Empresa Excluída com Sucesso!"));
		} catch (Exception e) {
			facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Erro ao Excluír Empresa!"));
		}
	}
	
	public void alterar() {
		empresa = empresaService.getEmpresa(id);
	}
	
	public void novo() {
		initEmpresa();
	}
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@Produces
	@Named
	public Empresa getEmpresa() {
		return empresa;
	}
	
	@PostConstruct
	public void initEmpresa() {
		empresa = new Empresa();
	}

}

Na página JSF eu criei um rich:tabPanel para exibir os dados e também com o formulário para persistência.
Ao criar um novo registro ou para excluir um registro existente, está funcionando corretamente. O problema está ao tentar alterar o registro.
Acredito que o problema está no Controller anotado como @Model, pois o objeto perde a referência ao registro e tenta inserir um novo registro e não alterar o registro existente.
Alterei meu controle para @SessionScoped com @Named, ele apresenta a mensagem que está alterando o registro, mas não altera.
Alguem pode me dizer como devo fazer para que funcione? Qual é a forma correta para fazer isto?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:rich="http://richfaces.org/rich"
   xmlns:a4j="http://richfaces.org/a4j"
   template="/WEB-INF/templates/default.xhtml">

	<ui:define name="content">
	
		<h:panelGroup rendered="#{empty empresas}">
        	<em>Não há empresas cadastradas.</em>
      	</h:panelGroup>
      					
		<rich:tabPanel switchType="client">
			<rich:tab header="Lista">
				<h:form>
					<p>
						<h:commandLink value="Novo" action="#{empresaController.novo}" />
					</p>
					<rich:dataTable value="#{empresas}" var="_empresa" id="tabEmpresa" rendered="#{not empty empresas}" rows="15">
						<rich:column id="id">
							<f:facet name="header">
								Id
							</f:facet>
							#{_empresa.id}
						</rich:column>
						<rich:column id="nome">
							<f:facet name="header">
								Nome
							</f:facet>
							#{_empresa.nome}
						</rich:column>
						<rich:column id="apelido">
							<f:facet name="header">
								Apelido
							</f:facet>
							#{_empresa.apelido}
						</rich:column>
						<rich:column id="email">
							<f:facet name="header">
								E-Mail
							</f:facet>
							#{_empresa.email}
						</rich:column>
						<rich:column id="cnpj">
							<f:facet name="header">
								CNPJ
							</f:facet>
							#{_empresa.cnpj}
						</rich:column>
						<rich:column id="telefone">
							<f:facet name="header">
								Telefone
							</f:facet>
							#{_empresa.telefone}
						</rich:column>
						<rich:column id="celular">
							<f:facet name="header">
								Celular
							</f:facet>
							#{_empresa.celular}
						</rich:column>
						<rich:column id="responsavel">
							<f:facet name="header">
								Responsável
							</f:facet>
							#{_empresa.responsavel}
						</rich:column>
						<rich:column id="ativo">
							<f:facet name="header">
								Status
							</f:facet>
							#{_empresa.ativo}
						</rich:column>
						<rich:column>
							<h:commandLink value="Alterar" action="#{empresaController.alterar}">
         						<f:setPropertyActionListener value="#{_empresa.id}" target="#{empresaController.id}" />
         					</h:commandLink>
         				</rich:column>
						<rich:column>
         					<h:commandLink value="Remove" action="#{empresaController.excluir}" onclick="if (!confirm('Confirma exclusão?')){return false;};">
         						<f:setPropertyActionListener value="#{_empresa.id}" target="#{empresaController.id}" />
         					</h:commandLink>
         				</rich:column>
					</rich:dataTable>
				</h:form>
			</rich:tab>
			<rich:tab header="Formulário">
				<h:form>
					<h:panelGrid columns="3" columnClasses="titleCell">
						<h:outputLabel for="id" value="Id:" rendered="#{not empty empresa.id}"/>
            			<h:inputText id="id" value="#{empresa.id}" rendered="#{not empty empresa.id}" disabled="true"/>
            			<h:message for="id" errorClass="invalid" rendered="#{not empty empresa.id}"/>
            			
						<h:outputLabel for="nome" value="Nome:"/>
            			<h:inputText id="nome" value="#{empresa.nome}" />
            			<h:message for="nome" errorClass="invalid"/>
            			
            			<h:outputLabel for="apelido" value="Apelido:"/>
            			<h:inputText id="apelido" value="#{empresa.apelido}" />
            			<h:message for="apelido" errorClass="invalid"/>
            			
            			<h:outputLabel for="email" value="E-Mail:"/>
            			<h:inputText id="email" value="#{empresa.email}" />
            			<h:message for="email" errorClass="invalid"/>
            			
            			<h:outputLabel for="cnpj" value="Cnpj:"/>
            			<h:inputText id="cnpj" value="#{empresa.cnpj}" />
            			<h:message for="cnpj" errorClass="invalid"/>
            			
            			<h:outputLabel for="telefone" value="Telefone:"/>
            			<h:inputText id="telefone" value="#{empresa.telefone}" />
            			<h:message for="telefone" errorClass="invalid"/>
            			
            			<h:outputLabel for="celular" value="Celular:"/>
            			<h:inputText id="celular" value="#{empresa.celular}" />
            			<h:message for="celular" errorClass="invalid"/>
            			
            			<h:outputLabel for="responsavel" value="Responsável:"/>
            			<h:inputText id="responsavel" value="#{empresa.responsavel}" />
            			<h:message for="responsavel" errorClass="invalid"/>
            			
            			<h:outputLabel for="site" value="Site:"/>
            			<h:inputText id="site" value="#{empresa.site}" />
            			<h:message for="site" errorClass="invalid"/>
            			
            			<h:outputLabel for="observacao" value="Observação:"/>
            			<h:inputText id="observacao" value="#{empresa.observacao}" />
            			<h:message for="observacao" errorClass="invalid"/>
            			
					</h:panelGrid>
					
					<p>
    	        		<h:panelGrid columns="2">
        	       			<h:commandButton id="salvar" action="#{empresaController.salvar}" value="Salvar" styleClass="register"/>
            	   			<h:messages styleClass="messages" errorClass="invalid" infoClass="valid" warnClass="warning"
                	        	   globalOnly="true"/>
            			</h:panelGrid>
         			</p>
         		</h:form>
			</rich:tab>
		</rich:tabPanel>
	
	</ui:define>   

</ui:composition>

Resolvi mudando meu controller:

Também mudei meu Service, alterando o @Inject da propriedade EntityManager. Ficou desta forma:

[code]
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
[/quote]