Erro no Hibernate...HibernateSystemException

7 respostas
lrocha

Pessoal,

estou trabalhando com o java 1.4 e o hibernate 3 entre outras tecnologias..
Quando eu vou alterar ou incluir um registro ocorre a exceção HibernateSystemException.
Já dei uma pesquisada na "net" e vi q pode ser pq a aplicação esta com 2 objetos na sessão com o mesmo "id".. :roll:

Mesmo assim não vejo uma maneira do objeto estar com o mesmo "id" na sessão.

Estou trabalhando a pouco tempo com o hibernate..por isso não tenho muito conhecimento...

segue o erro:
type Exception report

message 

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

exception 

org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session: [br.com.fiergsRai.configuracao.model.FuncaoPerfil#432]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [br.com.fiergsRai.configuracao.model.FuncaoPerfil#432]
	org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:661)
	org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:413)
	org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:371)
	org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:614)
	br.com.develop.dao.hibernate.GenericDAO.save(GenericDAO.java:28)
	br.com.fiergsRai.configuracao.service.PerfilService.savePerfil(PerfilService.java:96)
	br.com.fiergsRai.configuracao.service.PerfilService$$FastClassByCGLIB$$424268ec.invoke(<generated>)
	net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
	org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:685)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:148)
	org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
	org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:623)
	br.com.fiergsRai.configuracao.service.PerfilService$$EnhancerByCGLIB$$46290ef5.savePerfil(<generated>)
	br.com.fiergsRai.configuracao.action.PerfilAction.incluirPerfil(PerfilAction.java:119)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	com.opensymphony.xwork.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:364)
	com.opensymphony.xwork.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:216)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:190)
	br.com.fiergsRai.principal.interceptor.LoginInterceptor.intercept(LoginInterceptor.java:117)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:168)
	com.opensymphony.xwork.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.xwork.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:115)
	com.opensymphony.xwork.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.webwork.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:171)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.webwork.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:147)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.xwork.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:151)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:31)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:186)
	com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:188)
	com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:113)
	com.opensymphony.webwork.dispatcher.DispatcherUtils.serviceAction(DispatcherUtils.java:225)
	com.opensymphony.webwork.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:202)
	com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
	com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
	com.opensymphony.webwork.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:88)
	org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)

Obrigado pela Força!!

7 Respostas

ricardolecheta

vc nao fez load deste FuncaoPerfil antes deste trecho que salva o objeto?

fsquadro

lrocha,

Poste ai o seu código, para darmos uma olhada! :slight_smile:

Paulo_Silveira

use o metodo merge em vez de update. E entenda o porque aqui:

lrocha

Hum…vou dar uma olhada…
O método que esta dando a exceção é esse:

public void savePerfil(Perfil perfil, Long[] funcoesID) {
        try {

            // salva o perfil
            this.perfilDAO.saveOrUpdate(perfil);

            // remove todos as funcoes associadas
            List lista = this.genericDAO.findAll(FuncaoPerfil.class);
            Iterator it = lista.iterator();
            while (it.hasNext()) {
                FuncaoPerfil fp = (FuncaoPerfil) it.next();
                if (fp.getPerfil() != null && fp.getPerfil().getId().equals(perfil.getId())) {
                    this.genericDAO.delete(fp);
                }
            }

            // adiciona as funcoes
            if (funcoesID != null) {
                for (int i = 0; i < funcoesID.length; i++) {
                    Funcao funcao = (Funcao) this.genericDAO.get(Funcao.class, funcoesID[i]);
                    FuncaoPerfil fp = new FuncaoPerfil();
                    fp.setFuncao(funcao);
                    fp.setPerfil(perfil);
                    this.genericDAO.save(fp);
                }
            }
            

        } catch (HibernateException hex) {
            throw SessionFactoryUtils.convertHibernateAccessException(hex);
        }

    }

Vou tentar achar a solução…se alguem tiver outra dica para me dar,
eu agradeço!!
Obrigado,
Lucas Rocha

Paulo_Silveira

troque o saveOrUpdate por merge, como eu disse. naquele post do blog tem a solucao que voce esta perguntando. nao pode ter dois objetos de mesmo id numa mesma sessao.

lrocha

Tipo, a exceção ocorre quando eu vou dar um save no genericDAO…
Quando eu vou salvar o objeto FuncaoPerfil…
Ja tentei mudar o save por saveOrUpdate e tbm não funcionou…

Ou seja, sera que ao inves de usar o save do genericDAO eu devo usar o merge??

Obrigado…

Paulo_Silveira

a exception diz que ja existe uma FuncaoPerfil 432 nessa session.

voce deve estar salvando um objeto que tem relacionamento com essa FuncaoPerfil, mas JA existe, nessa mesma session, uma Funcao Perfil de id 432. isso é, outra insntacia de FuncaoPerfil, representando a MESMA entidade. o que ele deve fazer? ele nao sabe o que fazer, entao ele da exception!

o merge (e voce vai precisar cascatear talvez, mas acho que voce ja tem cascade all) faz com que ele jogue a info dessa segunda FuncaoPerfil em cima da anterior na sessao.

Criado 17 de abril de 2007
Ultima resposta 18 de abr. de 2007
Respostas 7
Participantes 4