Erro usando Hibernate no momento de update .. immutable natural identifier of an instance

Olá,

ao tentar alterar na tela dados do usuario me apresentou o erro abaixo

se alguém puder me ajudar…

abs


HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: javax.servlet.ServletException: immutable natural identifier of an instance of financeiro.usuario.Usuario was altered
	financeiro.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:44)

root cause

javax.servlet.ServletException: immutable natural identifier of an instance of financeiro.usuario.Usuario was altered
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:321)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368)
	org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
	org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:119)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169)
	org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
	org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
	financeiro.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:32)

root cause

org.hibernate.HibernateException: immutable natural identifier of an instance of financeiro.usuario.Usuario was altered
	org.hibernate.event.def.DefaultFlushEntityEventListener.checkNaturalId(DefaultFlushEntityEventListener.java:121)
	org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:195)
	org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147)
	org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
	org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
	org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:58)
	org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:1185)
	org.hibernate.impl.SessionImpl.list(SessionImpl.java:1709)
	org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
	financeiro.usuario.UsuarioDAOHibernate.listar(UsuarioDAOHibernate.java:47)
	financeiro.usuario.UsuarioRN.listar(UsuarioRN.java:37)
	financeiro.web.UsuarioBean.getLista(UsuarioBean.java:76)
	sun.reflect.GeneratedMethodAccessor44.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:55)
	com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:71)
	org.apache.el.parser.AstValue.getValue(AstValue.java:169)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:192)
	com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:106)
	javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190)
	javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178)
	javax.faces.component.UIData.getValue(UIData.java:554)
	javax.faces.component.UIData.getDataModel(UIData.java:1278)
	javax.faces.component.UIData.setRowIndex(UIData.java:447)
	com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:77)
	javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:824)
	javax.faces.component.UIData.encodeBegin(UIData.java:937)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1641)
	javax.faces.render.Renderer.encodeChildren(Renderer.java:164)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:849)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1643)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
	com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:389)
	com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127)
	com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
	com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:309)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368)
	org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
	org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:119)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169)
	org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
	org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
	financeiro.web.filter.ConexaoHibernateFilter.doFilter(ConexaoHibernateFilter.java:32)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.4 logs.

@Entity
public class Usuario implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7390392097656238443L;
    @Id
    @GeneratedValue
    
	private Integer codigo;
    private String nome;
    private String email;
    @org.hibernate.annotations.NaturalId
    private String login;
    private String senha;
    private String celular;
    private Date nascimento;
    private String idioma;
    private boolean ativo;
    
    @ElementCollection(targetClass=String.class )
    @JoinTable(
        name="usuario_permissao",
              uniqueConstraints={@UniqueConstraint(columnNames={"usuario","permissao"})},
              joinColumns=@JoinColumn(name="usuario"))
    @Column(name="permissao",length=50)
    private Set<String> permissao = new HashSet<String>();


public class UsuarioDAOHibernate implements UsuarioDAO {

	private Session session;
	
	
	public void setSession(Session session) {
		this.session = session;
	}

	public void salvar(Usuario usuario) {
		
	   this.session.save(usuario);
	}

	public void atualizar(Usuario usuario) {
       this.session.update(usuario)	;
	}

	public void excluir(Usuario usuario) {
       this.session.delete(usuario);

	}

	public Usuario carregar(Integer codigo) {
		
		return (Usuario) this.session.get(Usuario.class, codigo);
	}

	public Usuario buscarPorLogin(String login) {
        String hql="select u from Usuario u where u.login = :login";
        Query consulta = this.session.createQuery(hql);
        consulta.setString("login", login);
		return (Usuario) consulta.uniqueResult();
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> listar() {
		
		return this.session.createCriteria(Usuario.class).addOrder(Order.asc("codigo")).list();
	}
	

	public Usuario buscaPorLogin(String login){
		String hql="select u from Usuario u where u.login = :login";
		Query consulta = this.session.createQuery(hql);
		consulta.setString("login", login);
		return (Usuario) consulta.uniqueResult();
	}
}

usuario.xhtml

<?xml version="1.0"  ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core" 
>
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Cadastro de Usuários</title>
</h:head>
<h:body>
  <h1>Cadastro de Usuários</h1>
  <h:form id="cadastro">
     <h:messages/>
     
     <h:inputHidden value="#{usuarioBean.usuario.codigo}"/>
     <h:inputHidden value="#{usuarioBean.usuario.ativo}"/>
     <h:inputHidden value="#{usuarioBean.destinoSalvar}"/>
     
     <h:panelGrid columns="2">
     
       <h:outputLabel value="Nome:" for ="nome"/>
       <h:inputText id="nome" label="Nome" value="#{usuarioBean.usuario.nome}" size="30" maxlength="30" required="true" requiredMessage="Você não tem nome?">
       <f:validateLength minimum="10" maximum="30"/>
       </h:inputText>


       <h:outputLabel value="Data Nascimento:" for ="data"/>
       <h:inputText id="data" label="Data Nascimento" value="#{usuarioBean.usuario.nascimento}" size="10" maxlength="10" required="true" >
       <f:convertDateTime dateStyle="medium"/>
       </h:inputText>
      
       <h:outputLabel value="Celular:" for ="celular"/>
       <h:inputText id="celular" label="Celular" value="#{usuarioBean.usuario.celular}" size="10" />
       
       <h:outputLabel value="e-Mail:" for ="email"/>
       <h:panelGroup>
          <h:inputText id="email" label="e-Mail" value="#{usuarioBean.usuario.email}" size="50" maxlength="50" required="true" validatorMessage="e-mail inválido">
          <f:validateRegex pattern="[a-zA-Z0-9\-\_\..]+@[a-zA-Z0-9\-\_\.]+"/>
          </h:inputText>
       <h:message for="email"/>
       </h:panelGroup>
       
       <h:outputLabel value="Idioma:" for ="idioma"/>
       <h:selectOneMenu id="idioma" value="#{usuarioBean.usuario.idioma}">
         <f:selectItem itemValue="pt_BR" itemLabel="Português"/>
         <f:selectItem itemValue="en_US" itemLabel="English"/>
         <f:selectItem itemValue="es_ES" itemLabel="Espanhol"/>
       </h:selectOneMenu>
       
       <h:outputLabel value="Login:" for ="login"/>
       <h:inputText id="login" label="login" value="#{usuarioBean.usuario.login}" size="15" maxlength="15" required="true" validatorMessage="Login deve ter no minimo 5 e no máximo 15 caracteres e só pode ter os simbolos '.' e '_' ">
       <f:validateRegex pattern="([a-z]|[0-9]|[.][_]){5,15}"/>       
       </h:inputText>            
       
       <h:outputLabel value="Senha:" for ="senha"/>
       <h:inputSecret id="senha" label="Senha" value="#{usuarioBean.usuario.senha}" size="10" maxlength="10" required="true" redisplay="true"/>
       
       <h:outputLabel value="Confirmar Senha:" for ="confirmarsenha"/>
       <h:inputSecret id="confirmarsenha" label="confirmar Senha" value="#{usuarioBean.confirmarSenha}" size="10" maxlength="10" required="true" redisplay="true"/>
         
     </h:panelGrid> 
     <h:commandButton action="#{usuarioBean.salvar}" value="Salvar"/>
      
  </h:form>
</h:body>
</html>

usuariobean.java


import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import financeiro.usuario.Usuario;
import financeiro.usuario.UsuarioRN;
@ManagedBean(name="usuarioBean")
@RequestScoped
public class UsuarioBean {
	private Usuario usuario = new Usuario();
	private String confirmarSenha;
	
	private List<Usuario> lista;
	private String destinoSalvar;
	public Usuario getUsuario() {
		return usuario;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
	public String novo(){
		this.destinoSalvar="usuarioSucesso";
		this.usuario= new Usuario();
		this.usuario.setAtivo(true);
		return "usuario";
	}
	public String editar(){
		this.confirmarSenha= this.usuario.getSenha();
		return "/publico/usuario";
	}

	public String salvar(){
		FacesContext context = FacesContext.getCurrentInstance();
		
		String senha = this.usuario.getSenha();
		if(!senha.equals(this.confirmarSenha)){
			FacesMessage facesMessage = new FacesMessage("A senha não foi confirmada corretamente");
			context.addMessage(null, facesMessage);
			return null;
		}
		
		UsuarioRN usuarioRN = new UsuarioRN();
		usuarioRN.salvar(this.usuario);
		return this.destinoSalvar;
	}

	public String exluir(){
		UsuarioRN usuarioRN = new UsuarioRN();
		usuarioRN.excluir(this.usuario);
		this.lista=null;
		return null;
	}
	
	public String ativar(){
		
		if(this.usuario.isAtivo())
			this.usuario.setAtivo(false);
		else
			this.usuario.setAtivo(true);
		
		UsuarioRN usuarioRN = new UsuarioRN();
		usuarioRN.salvar(this.usuario);
		this.lista=null;
		return null;
	}
	
	public List<Usuario> getLista(){
		if(this.lista==null){
			UsuarioRN usuarioRN = new UsuarioRN();
			this.lista=usuarioRN.listar();
			
		}
		return this.lista;
	}
	public String getConfirmarSenha() {
		return confirmarSenha;
	}
	public void setConfirmarSenha(String confirmarSenha) {
		this.confirmarSenha = confirmarSenha;
	}
	public String getDestinoSalvar() {
		return destinoSalvar;
	}
	public void setDestinoSalvar(String destinoSalvar) {
		this.destinoSalvar = destinoSalvar;
	}
	public void setLista(List<Usuario> lista) {
		this.lista = lista;
	}
	
	
	
}

e só da esse erro qdo altero o campo login…

se alguém puder me ajudar …

abs

A principio eu não vejo lógica para modificar o login pq ele é unico
como vc msm definiu

mas corrigir esse erro vc só precisa colocar na @NaturalId(mutable=true)

flw