Transaction not active - o que é?

Estou com problemas ao tentar alterar um objeto que tem relacionamento com outros objetos, meu código está assim:

package com.modelo.managedBean;

import com.modelo.bean.Promotor;
import com.modelo.dao.PromotorDAO;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class PromotorMB implements Serializable {

	private Integer id;
	private PromotorDAO promotorDAO;
	private Promotor promotor = new Promotor();
	private List<Promotor> promotores = new ArrayList<Promotor>();

	// GETTER / SETTER
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
		if (id != null) {
			promotor = promotorDAO.recuperarPromotor(this.getId());
		}
	}

	public Promotor getPromotor() {
		return promotor;
	}

	public void setPromotor(Promotor promotor) {
		this.promotor = promotor;
	}

	public List<Promotor> getPromotores() {
		promotorDAO = new PromotorDAO();
		promotores = promotorDAO.listarPromotores();
		return promotores;
	}

	// REGRAS DE NEGÓCIO
	public String salvar() {
		promotor.getGrupoAcesso().setLogin(promotor.getLogin());
		if (promotorDAO.inserirPromotor(promotor)) {
			return "sucessoOperacao";
		} else {
			return "falhaOperacao";
		}
	}

	public String excluir() {
		promotor = promotorDAO.recuperarPromotor(promotor.getIdUsuario());
		if (promotorDAO.excluirPromotor(promotor)) {
			return "sucessoOperacao";
		} else {
			return "falhaOperacao";
		}
	}

	public String atualizar() {
		//promotor.getGrupoAcesso().setLogin(promotor.getLogin());
		promotorDAO = new PromotorDAO();
		if (promotorDAO.atualizarPromotor(promotor)) {
			return "sucessoOperacao";
		} else {
			return "falhaOperacao";
		}
	}
}

Eu listo todos os registros daquele tipo na tela, escolho qual eu desejo alterar e passo ele pra outra tela de edição, quando passo ele pra tela de edição carrego o managedBean referente ao objeto, eu debuguei e ele está vindo blz, está puxando todos os objetos relacionados. Porém quando vou dar o merge no BD ocorre este erro:

Advertência: #{promotorMB.atualizar}: java.lang.IllegalStateException: Transaction not active
javax.faces.FacesException: #{promotorMB.atualizar}: java.lang.IllegalStateException: Transaction not active
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:563)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:722)
Caused by: javax.faces.el.EvaluationException: java.lang.IllegalStateException: Transaction not active
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	... 23 more
Caused by: java.lang.IllegalStateException: Transaction not active
	at org.hibernate.ejb.TransactionImpl.rollback(TransactionImpl.java:82)
	at com.modelo.dao.PromotorDAO.atualizarPromotor(PromotorDAO.java:58)
	at com.modelo.managedBean.PromotorMB.atualizar(PromotorMB.java:68)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:191)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	... 24 more

código da persistencia:

package com.modelo.dao;

import com.modelo.bean.Promotor;
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 PromotorDAO {

	private EntityManagerFactory factory = null;
	private EntityManager manager = null;

	public PromotorDAO() {
		factory = Persistence.createEntityManagerFactory("TurismoGuiadoPU");
		manager = factory.createEntityManager();
	}

	public boolean inserirPromotor(Promotor promotor) {
		try {
			manager.getTransaction().begin();
			manager.persist(promotor);
			manager.getTransaction().commit();
			return true;
		} catch (Exception e) {
			manager.getTransaction().rollback();
			System.err.println("Erro: " + e.getMessage());
			return false;
		} finally {
			manager.close();
		}
	}

	public boolean excluirPromotor(Promotor promotor) {
		try {
			manager.getTransaction().begin();
			manager.remove(promotor);
			manager.getTransaction().commit();
			return true;
		} catch (Exception e) {
			manager.getTransaction().rollback();
			System.err.println("Erro: " + e.getMessage());
			return false;
		} finally {
			manager.close();
		}
	}

	public boolean atualizarPromotor(Promotor promotor) {
		try {
			manager.getTransaction().begin();
			manager.merge(promotor);
			manager.getTransaction().commit();
			return true;
		} catch (Exception e) {
			manager.getTransaction().rollback();
			System.err.println("Erro: " + e.getMessage());
			return false;
		} finally {
			manager.close();
		}
	}

	public Promotor recuperarPromotor(int idPromotor) {
		Promotor promotor = manager.find(Promotor.class, idPromotor);
		return promotor;
	}

	public List<Promotor> listarPromotores() {
		EntityTransaction transaction = manager.getTransaction();

		Query query = manager.createQuery("SELECT a FROM Promotor a");
		List<Promotor> promotores = query.getResultList();
		return promotores;
	}
}

cara troca ai

em.merge(em.merge(promotor));

merge não é update

da uma lida na especificação do JPA

[quote=ErickMacedo]cara troca ai

em.merge(em.merge(promotor));

merge não é update

da uma lida na especificação do JPA[/quote]
Não?? Se não fosse pedir muito, onde eu encontro a especificação?

documentação do JPA-TopLink
http://www.oracle.com/technetwork/middleware/toplink/documentation/index.html

outros links
http://www.oracle.com/technetwork/articles/javaee/jpa-137156.html

[quote=ErickMacedo]cara troca ai

em.merge(em.merge(promotor));

merge não é update

da uma lida na especificação do JPA[/quote]
Não entendi agora, porque no link pro outro post que você passou, o tnaires afirma:

Conseguiria explicar o que são objetos: detached e managed?
Percebi que discussão toda se dá em torno destes conceitos e não sei o que significam "/

Desculpe, confundi merge com refresh

da uma lida

http://markmail.org/message/3ahb4bm6grnty3do

Com base neste link http://blog.caelum.com.br/entidades-managed-transient-e-detached-no-hibernate-e-jpa/, eu acho que o meu objeto GrupoAcesso está detached pois quando eu faço um em.find(Promotor.class, 1); ele não está trazendo o grupoAcesso vinculado a ele.
Partindo desta conclusão, acredito ter duas opções:
1 - Posso configurar as anotações corretamente pra que o GrupoAcesso fique vinculado ao Promotor - acredito ser o correto
2 - Posso tratar o GrupoAcesso como detached, ou seja, no caso do exemplo, fazer isto:

Cliente c = new Cliente();
c.setId(1);
c = em.merge(c);
c.setNome("Cliente com nome alterado");

Este código do exemplo faz a mesma coisa que o ErickMacedo falou, certo?

Já li e reli várias vezes, mas não consigo entender isso. O que eu posso fazer pra resolver isso?

trasitente = quando o objeto não tem representação no banco de dados

Ex: Produto produto = new Produto();

Manager = quando o objeto está gerenciado pelo EntityManager

Ex: Produto c = em.find(Produto.class , 1)

neste caso se agente mudar um atributo do produto por exemplo, automaticamento no momento do commit ele irá sofrer alteração
no banco de dados
Obs: aqui você temque saber se você esta usando Transação pelo Container ou pela aplicação, se estiver usando pela aplicação
cabe a você dar o commit.

Detached = quando você tem um objeto que aparentemente é igual á do banco de dados , porem o EntityManager não sabe que ele existe.

	Ex:
	Produto produto = new Produto();
	produto.setId(0008);

Ex: Para atualizar

	Produto produto = new Produto();
	produto.setId(0008);
	em.merge(produto );
	produto.setMarca("Samsung");

No exemplo acima o merge apenas junta a possível entidade com mesmo id que se encontra no EntityManager, mais ele não retorno
o objeto no estado de Manager (gerenciado), ou seja o produto ficou gerenciado somente durante o em.merge(produto ), depois ele
continua um objeto Transitente, Então precisamos pegar o retorno do merge que este retorna um objeto no estado Manager como no
código abaixo.

Produto produto = new Produto();
	produto.setId(0008);
	produto = em.merge(produto );
	produto.setMarca("Samsung");[

Então respondendo sua pergunra , SIM

Então eu vou ter que primeiro colocar o objeto no EntityManager, no meu caso usando o método recuperarPromotor(int idPromotor), uma vez que o mesmo está gerenciado, posso atualizar sem problemas com o merge, é isso?

Cara, eu acho estranho porque as outras funcionalidades estão usando o mesmo padrão de CRUD, e somente nesta ocorreu este erro "/
Quando estou mandando listar os promotores getPromotores() está entrando em looping, depois de umas 10 passadas no looping, ele sai e exibe a lista sem erros "/

Aparentemente Sim, só temque tomar cuidado se o EntityManager da onde você esta tirando esse promotor não estiver mais aberta na hora do commit o objeto mudará seu estado para detached e obviamente qualquer mudança nessa referência não surtirá efeito no banco de dados

Eu particularmente usaria esta sintaxe

em.merge(em.merge(promotor)); 

Assim ele pega o objeto no estado manager e atualiza.

Cara o JPA funciona assim!! eu não sou um expertise em JPA, temque dar uma analisada para saber o que esta acontecendo com o restante…

Olha só como estou fazendo, primeiro são listados todos os Promotores:

<?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="/resources/template.xhtml"
				xmlns:p="http://primefaces.org/ui"
				xmlns:h="http://java.sun.com/jsf/html"
				xmlns:f="http://java.sun.com/jsf/core">

    <ui:define name="Conteudo">
		<h:form prependId="false" id="categoriaForm">
			<p:growl id="growl" showDetail="true" globalOnly="true"/>
			<p:panel header="Visualizar Promotor" id="panel">
				<p:messages autoUpdate="true"/>
				<p:dataTable value="#{promotorMB.promotores}" var="promotor"
							 rowStyleClass="#{empty rowIx or rowIx mod 2 ne 0 ? 'tabelaLinhaCorClara' : ' tabelaLinhaCorEscura'}" rowIndexVar="rowIx"
							 emptyMessage="Não há registros cadastrados.">

					<p:column styleClass="tabelaColunaPequena">
						<f:facet name="header">
							<h:outputText value="ID"/>
						</f:facet>
						<h:outputText value="#{promotor.idUsuario}"/>
					</p:column>

					<p:column>
						<f:facet name="header">
							<h:outputText value="Nome" />
						</f:facet>
						<h:outputText value="#{promotor.nome}"/>
					</p:column>

					<p:column>
						<f:facet name="header">
							<h:outputText value="Nome Fantasia"/>
						</f:facet>
						<h:outputText value="#{promotor.nomeFantasia}"/>
					</p:column>

					<p:column>
						<f:facet name="header">
							<h:outputText value="CNPJ"/>
						</f:facet>
						<h:outputText value="#{promotor.CNPJ}"/>
					</p:column>

					<p:column>
						<f:facet name="header">
							<h:outputText value="Situação"/>
						</f:facet>
						<h:outputText value="Ativo" rendered="#{promotor.ativo}"/>
						<h:outputText value="Inativo" rendered="#{!promotor.ativo}"/>
					</p:column>

					<p:column styleClass="tabelaColunaPequena">
						<f:facet name="header">
							<h:outputText value="Editar"/>
						</f:facet>
						<h:commandLink action="telaEditarPromotor">
							<h:graphicImage url="/resources/imagens/editar.png" width="20" height="20"/>
							<f:setPropertyActionListener value="#{promotor.idUsuario}" target="#{promotorMB.id}"/>
						</h:commandLink>
					</p:column>
				</p:dataTable>
			</p:panel>
		</h:form>
    </ui:define>
</ui:composition>

Após selecionado a opção editar, é passado o idUsuario(que seria o id do Promotor) para o PromotorMB.
Na classe PromtorMB, quando ele recebe o idUsuario, o UsuarioDAO vai no BD e traz o promotor correto. Está managed.
Agora a tela de edição:

<?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="/resources/template.xhtml"
				xmlns="http://www.w3.org/1999/xhtml"
				xmlns:h="http://java.sun.com/jsf/html"
				xmlns:p="http://primefaces.org/ui"
				xmlns:f="http://java.sun.com/jsf/core">

    <ui:define name="Conteudo">
		<h:form prependId="false">
			<p:growl id="growl" showDetail="true" globalOnly="true"/>
			<p:panel header="Cadastro Promotor">
				<p:messages autoUpdate="true"/>
				<h:inputHidden value="#{promotorMB.promotor.idUsuario}"/>
				<p:fieldset legend="Identificação" toggleable="true" toggleSpeed="500">  
					<p:ajax event="toggle" listener="#{fieldsetBean.handleToggle}" update="growl" />  
					<h:panelGrid columns="2" cellpadding="10">

						<h:outputLabel styleClass="labelForm" value="*Login: " for="login"/>
						<p:inputText
							id="login"
							value="#{promotorMB.promotor.login}"
							size="20"
							required="true">
							<f:validateLength minimum="3" maximum="20"/>
						</p:inputText>

						<h:outputLabel styleClass="labelForm" value="*Nome: " for="nome"/>
						<p:inputText
							id="nome"
							value="#{promotorMB.promotor.nome}"
							size="60"
							required="true">
							<f:validateLength minimum="3" maximum="60"/>
						</p:inputText>

						<h:outputLabel styleClass="labelForm" value="*Razão Social: " for="razaoSocial"/>
						<p:inputText
							id="razaoSocial"
							value="#{promotorMB.promotor.razaoSocial}"
							size="60"
							required="true">
							<f:validateLength minimum="3" maximum="60"/>
						</p:inputText>

						<h:outputLabel styleClass="labelForm" value="*Nome Fantasia: " for="nomeFantasia"/>
						<p:inputText
							id="nomeFantasia"
							value="#{promotorMB.promotor.nomeFantasia}"
							size="60"
							required="true">
							<f:validateLength minimum="3" maximum="60"/>
						</p:inputText>

						<h:outputLabel styleClass="labelForm" value="*CNPJ: " for="cnpj"/>
						<p:inputMask
							id="cnpj"
							value="#{promotorMB.promotor.CNPJ}"
							mask="99.999.999-99"
							required="true"/>

						<h:outputLabel styleClass="labelForm" value="Situação" for="situacaoPromotor"/>
						<p:selectOneMenu id="situacaoPromotor" value="#{promotorMB.promotor.ativo}" effect="fade" required="true">
							<f:selectItem itemValue="#{!promotorMB.promotor.ativo}"  itemLabel="Ativo"/>
							<f:selectItem itemValue="#{promotorMB.promotor.ativo}"  itemLabel="Inativo"/>
						</p:selectOneMenu>
					</h:panelGrid>  
				</p:fieldset>

				<p:fieldset legend="Endereço" toggleable="true" toggleSpeed="500">  
					<p:ajax event="toggle" listener="#{fieldsetBean.handleToggle}" update="growl" />  
					<h:panelGrid columns="4" cellpadding="10">  

						<h:outputLabel styleClass="labelForm" value="*Rua: " for="rua"/>
						<p:inputText
							id="rua"
							value="#{promotorMB.promotor.endereco.rua}"
							size="60"
							required="true">
							<f:validateLength minimum="3" maximum="60"/>
						</p:inputText>

						<h:outputLabel styleClass="labelForm" value="*Número: " for="numero"/>
						<p:inputText
							id="numero"
							value="#{promotorMB.promotor.endereco.numero}"
							size="6"
							required="true">
							<f:validateLength minimum="1" maximum="6"/>
						</p:inputText>

						<h:outputLabel styleClass="labelForm" value="*Bairro: " for="bairro"/>
						<p:inputText
							id="bairro"
							value="#{promotorMB.promotor.endereco.bairro}"
							size="30"
							required="true">
							<f:validateLength minimum="3" maximum="30"/>
						</p:inputText>

						<h:outputLabel styleClass="labelForm" value="*CEP: " for="cep"/>
						<p:inputMask
							id="cep"
							value="#{promotorMB.promotor.endereco.CEP}"
							mask="99.999-999"
							required="true">
						</p:inputMask>

						<h:outputLabel styleClass="labelForm" value="*Cidade " for="cidade"/>
						<p:inputText
							id="cidade"
							value="#{promotorMB.promotor.endereco.cidade}"
							size="30"
							required="true">
							<f:validateLength minimum="3" maximum="30"/>
						</p:inputText>

						<h:outputLabel styleClass="labelForm" value="*Estado: " for="estado"/>
						<p:inputText
							id="estado"
							value="#{promotorMB.promotor.endereco.estado}"
							size="2"
							maxlength="2"
							required="true">
							<f:validateLength minimum="2" maximum="2"/>
						</p:inputText>
					</h:panelGrid>  
				</p:fieldset>

				<p:fieldset legend="Contato" toggleable="true" toggleSpeed="500">  
					<p:ajax event="toggle" listener="#{fieldsetBean.handleToggle}" update="growl" />  
					<h:panelGrid columns="2" cellpadding="10">  
						<h:outputLabel styleClass="labelForm" value="Telefone: " for="tel"/>
						<p:inputMask
							id="tel"
							value="#{promotorMB.promotor.contato.numeroTelefone}"
							mask="(99)9999-9999"
							size="12"/>

						<h:outputLabel styleClass="labelForm" value="*Celular: " for="celular"/>
						<p:inputMask
							id="celular"
							value="#{promotorMB.promotor.contato.numeroCelular}"
							mask="(99)9999-9999"
							required="true"
							size="12"/>

						<h:outputLabel styleClass="labelForm" value="*Email: " for="email"/>
						<p:inputText
							id="email"
							value="#{promotorMB.promotor.contato.email}"
							size="60"
							required="true">
							<f:validateLength minimum="3" maximum="60"/>
						</p:inputText>
					</h:panelGrid>  
				</p:fieldset>
				<h:outputText styleClass="campoObrigatorio" value="(*)Campos de preenchimento obrigatório."/>

				<p:panel style="text-align: center" collapsed="2">
					<p:commandButton value="Salvar" action="#{promotorMB.atualizar}"/>
					<p:commandButton value="Cancelar" type="reset"/>
				</p:panel>
			</p:panel>
		</h:form>
	</ui:define>
</ui:composition>

Continua managed quando chamado o promotorMB.atualizar…

Já tentei fazer assim, ocorre o mesmo erro…

Agora que eu vi seu MB do JSF

Seguinte você NÃO pode ter código DAO no getPromotores() !!!

No ciclo de vida do JSF ele chama varias vezes o get e set de objeto!! isso causa um impasse desnecessário na aplicação

Nenhum desses dois códigos funciona?

em.merge(em.merge(promotor));   

ou 

    produto = em.merge(produto );  
    produto.setMarca("Samsung");

editado…

cara verifica se o promotor passador nessa linha
promotorDAO.atualizarPromotor(promotor))
está sendo populado com id e dados corretamente

[quote=ErickMacedo]Agora que eu vi seu MB do JSF

Seguinte você NÃO pode ter código DAO no getPromotores() !!!

No ciclo de vida do JSF ele chama varias vezes o get e set de objeto!! isso causa um impasse desnecessário na aplicação
[/quote]
Então, por isso ele fica naquele looping lá…onde seria ideal eu carregar a lista então? No construtor do MB?

O primeiro código já testei, não funciona. Vou testar a segunda opção.

Eu acredito que está puxando corrtamente o Promotor pelo ID, mas vou me certificar disso e volto a postar.

Em qual scopo está seu Managend Bean?

Está como @RequestScoped.

Então pode colocar no construtor, ou no metodo que chama aquela pagina

[quote=ErickMacedo]Agora que eu vi seu MB do JSF

Seguinte você NÃO pode ter código DAO no getPromotores() !!!

No ciclo de vida do JSF ele chama varias vezes o get e set de objeto!! isso causa um impasse desnecessário na aplicação

Nenhum desses dois códigos funciona?

em.merge(em.merge(promotor));   

ou 

    produto = em.merge(produto );  
    produto.setMarca("Samsung");

editado…

cara verifica se o promotor passador nessa linha
promotorDAO.atualizarPromotor(promotor))
está sendo populado com id e dados corretamente[/quote]
Tentei fazer das duas formas e nada.
O Promotor está sendo populador corretamente, traz todos os dados gravados e todas os objetos que estão inseridos nele também.

Cara, esse erro não pode estar ocorrendo por outro motivo?
Olha minha classe Promotor:

package com.modelo.bean;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Temporal;

@Entity
public class Promotor extends Usuario {
	@Column(length = 60, nullable = false)
	private String razaoSocial;
	
	@Column(length = 60, nullable = false)
	private String nomeFantasia;
	
	@Column(length = 14, nullable = false)
	private String CNPJ;
	private Boolean ativo = false;
	
	@Temporal(javax.persistence.TemporalType.TIMESTAMP)
	@Column(updatable = false, nullable = false)
	private Date dataCriacao;

	public String getCNPJ() {
		return CNPJ;
	}

	public void setCNPJ(String CNPJ) {
		this.CNPJ = CNPJ;
	}

	public Boolean getAtivo() {
		return ativo;
	}

	public void setAtivo(Boolean ativo) {
		this.ativo = ativo;
	}

	public String getNomeFantasia() {
		return nomeFantasia;
	}

	public void setNomeFantasia(String nomeFantasia) {
		this.nomeFantasia = nomeFantasia;
	}

	public String getRazaoSocial() {
		return razaoSocial;
	}

	public void setRazaoSocial(String razaoSocial) {
		this.razaoSocial = razaoSocial;
	}

	public GrupoAcesso getGrupoAcesso() {
		return grupoAcesso;
	}

	public void setGrupoAcesso(GrupoAcesso grupoAcesso) {
		this.grupoAcesso = grupoAcesso;
	}

	public Date getDataCriacao() {
		return dataCriacao;
	}

	public void setDataCriacao(Date dataCriacao) {
		this.dataCriacao = dataCriacao;
	}
	
	// Regras de negócio
	public void registrarDataCriacao() {
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
		dataCriacao = new Date();

		df.format(dataCriacao);
		this.setDataCriacao(dataCriacao);
	}
}

e minha classe Usuario:

package com.modelo.bean;

import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
import javax.persistence.OneToOne;

@MappedSuperclass
public abstract class Usuario implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	protected Integer idUsuario;
	
	@Column(unique = true, length = 20, nullable = false)
	protected String login;
	
	@Column(length = 16, nullable = false)
	protected String senha;
	
	@Column(length = 60, nullable = false)
	protected String nome;
	
	@OneToOne(cascade = CascadeType.ALL)
	@JoinColumn(name = "idContato")
	protected Contato contato = new Contato();
	
	@OneToOne(cascade = CascadeType.ALL)
	@JoinColumn(name = "idEndereco")
	protected Endereco endereco = new Endereco();
	
	@OneToOne(cascade = CascadeType.ALL, optional = false, fetch = FetchType.EAGER)
	@JoinColumn(name = "login", insertable=false, updatable=false, referencedColumnName = "login")
	protected GrupoAcesso grupoAcesso = new GrupoAcesso();
	
//	@ManyToOne(cascade = CascadeType.ALL)
//	@JoinColumn(name = "login", insertable=false, updatable=false)
//	protected GrupoAcesso grupoAcesso = new GrupoAcesso();

	public Integer getIdUsuario() {
		return idUsuario;
	}

	public void setIdUsuario(Integer idUsuario) {
		this.idUsuario = idUsuario;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Contato getContato() {
		return contato;
	}

	public void setContato(Contato contato) {
		this.contato = contato;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
}

Cara , só com o código para realizar testes , não sei oque pode ser, mais tenta tirar o updatable = false desta linha

    @Temporal(javax.persistence.TemporalType.TIMESTAMP)  
    @Column(updatable = false, nullable = false)  
    private Date dataCriacao;