Problemas com anotação @PreUpdate

Olá,

Alguém já usou as anotações @PrePersist e @PreUpdate para validação da entity ?


@Entity
@NamedQuery(name = "Usuario.findAll", query = "select u from Usuario u ORDER BY u.nome ASC")
@Table(name = "usuario")
@SequenceGenerator(name = "sequsuario", sequenceName = "sequsuario", allocationSize = 1, initialValue = 1)
public class Usuario extends AbstractEntity implements Serializable, Comparator<Usuario>, Comparable<Usuario> {
    @Id
    @Column(name = "idusuario", nullable = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
                    generator = "sequsuario")
    private Long idUsuario;

    @Column(name = "nome", unique = true, nullable = false)
    private String nome;

    @Column(name = "senha", unique = true, nullable = false)
    private String senha;

    @PrePersist
    @PreUpdate
    public void validate() throws ERPException  {
        if(this.nome == null || this.nome.equals("")) {
            throw new ERPException(MessageBundle.ACESSO_USUARIO_NOME_OBRIGATORIO);
        }
        if(this.senha == null || this.senha.equals("")) {
            throw new ERPException(MessageBundle.ACESSO_USUARIO_SENHA_OBRIGATORIO);
        }
    }

}

A princípio pra mim isso deveria funcionar, mas só funciona qdo crio uma entidade nova, e mando salvar na base. Se estiver faltando o nome ou senha ele dispara uma exceção “ERPException” e exibe a mensagem internacionalizada ao usuário.

Entretanto, quando edito uma entidade existente, altero e mando salvar ele não dispara a exceção de validação “ERPException”, mas uma exceção de Rollback porque os campos são obrigatórios.

E é justamente este comportamento que não desejo, pois gostaria que ele tratasse a exceção “ERPException”, e exibisse a mensagem internacionalizada.

@braços

Esta usando EJB?

Seja mais específico, coloque a stacktrace ou o nome da exceção correto.

Falow

Thiago,

Brow… Por acaso você conhece as anotações que postei, no código fornecido, em outra tecnologia que não seja EJB3/JPA ? Se te causou dúvida isso, então vou te responder… Sim é EJB3/JPA! :wink:

Outra coisa que é que o nome da exceção está correto meu caro colega. ERPException é uma exceção do sistema que trata as mensagens e as internacionaliza.

A outra exceção gerada é de RollBack e o motivo pelo qual ela é disparada é conhecido, e como disse refere-se a restrição de nullable conforme vc pode ver nas anotações dos atributos da entidade “@Column(name = “nome”, unique = true, nullable = false)”.

Sendo assim, a pilha gerada por este motivo de pouco importa, mas se vc faz questão segue abaixo:

O problema é que o @PreUpdate não é invocado para entidades já persistidas na base, mas somente para entidades novas.

Pilha gerada ao tentar atualizar, deixando campos obrigatórios vazios.

javax.transaction.RollbackException: Transaction marked for rollback.
	at com.sun.enterprise.distributedtx.J2EETransaction.commit(J2EETransaction.java:440)
	at com.sun.enterprise.distributedtx.J2EETransactionManagerOpt.commit(J2EETransactionManagerOpt.java:371)
	at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3792)
	at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3585)
	at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)
	at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
	at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
	at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
	at $Proxy62.atualizarEntidade(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
	at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
	at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
	at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
	at br.com.erp.gestaocomum.model.business.interfaces.__BaseBusinessRemote_Remote_DynamicStub.atualizarEntidade(br/com/erp/gestaocomum/model/business/interfaces/__BaseBusinessRemote_Remote_DynamicStub.java)
	at br.com.erp.gestaocomum.model.business.interfaces._BaseBusinessRemote_Wrapper.atualizarEntidade(br/com/erp/gestaocomum/model/business/interfaces/_BaseBusinessRemote_Wrapper.java)
	at br.com.erp.gestaocomum.view.beans.BaseBean.postChanges(BaseBean.java:54)
	at br.com.erp.gestaoacesso.view.modules.ManterClasseModule.salvarClasse(ManterClasseModule.java:49)
	at br.com.erp.gestaoacesso.view.web.ClasseForm.salvarClasse(ClasseForm.java:233)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.el.parser.AstValue.invoke(AstValue.java:187)
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
	at org.apache.myfaces.trinidadinternal.taglib.util.MethodExpressionMethodBinding.invoke(MethodExpressionMethodBinding.java:53)
	at org.apache.myfaces.trinidad.component.UIXComponentBase.broadcastToMethodBinding(UIXComponentBase.java:1245)
	at org.apache.myfaces.trinidad.component.UIXCommand.broadcast(UIXCommand.java:183)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:317)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
	at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl._doFilterImpl(TrinidadFilterImpl.java:247)
	at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:157)
	at org.apache.myfaces.trinidad.webapp.TrinidadFilter.doFilter(TrinidadFilter.java:92)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
	at br.com.erp.gestaoacesso.view.util.SecurityFilter.doFilter(SecurityFilter.java:55)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
	at br.com.erp.gestaoacesso.view.util.SecurityFilter.doFilter(SecurityFilter.java:55)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:285)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:341)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:288)
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:272)
	at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637)
	at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568)
	at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813)
	at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
	at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
	at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
	at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
	at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
javax.ejb.EJBException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaction marked for rollback.
	at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3798)
	at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3585)
	at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1354)
	at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
	at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
	at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
	at $Proxy62.atualizarEntidade(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
	at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:183)
	at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:219)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:192)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
	at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
	at br.com.erp.gestaocomum.model.business.interfaces.__BaseBusinessRemote_Remote_DynamicStub.atualizarEntidade(br/com/erp/gestaocomum/model/business/interfaces/__BaseBusinessRemote_Remote_DynamicStub.java)
	at br.com.erp.gestaocomum.model.business.interfaces._BaseBusinessRemote_Wrapper.atualizarEntidade(br/com/erp/gestaocomum/model/business/interfaces/_BaseBusinessRemote_Wrapper.java)
	at br.com.erp.gestaocomum.view.beans.BaseBean.postChanges(BaseBean.java:54)
	at br.com.erp.gestaoacesso.view.modules.ManterClasseModule.salvarClasse(ManterClasseModule.java:49)
	at br.com.erp.gestaoacesso.view.web.ClasseForm.salvarClasse(ClasseForm.java:233)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.el.parser.AstValue.invoke(AstValue.java:187)
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
	at org.apache.myfaces.trinidadinternal.taglib.util.MethodExpressionMethodBinding.invoke(MethodExpressionMethodBinding.java:53)
	at org.apache.myfaces.trinidad.component.UIXComponentBase.broadcastToMethodBinding(UIXComponentBase.java:1245)
	at org.apache.myfaces.trinidad.component.UIXCommand.broadcast(UIXCommand.java:183)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:317)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
	at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl._doFilterImpl(TrinidadFilterImpl.java:247)
	at org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:157)
	at org.apache.myfaces.trinidad.webapp.TrinidadFilter.doFilter(TrinidadFilter.java:92)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
	at br.com.erp.gestaoacesso.view.util.SecurityFilter.doFilter(SecurityFilter.java:55)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
	at br.com.erp.gestaoacesso.view.util.SecurityFilter.doFilter(SecurityFilter.java:55)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:285)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:341)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:288)
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:272)
	at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637)
	at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568)
	at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813)
	at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
	at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
	at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
	at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
	at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)

@braços

ccllss,

Vamos por partes.

Eu queria saber se era EJB3m, pois pode se utilizar JPA sem EJB.

Sua ERPException deve ser uma unchecked exception para estar no lifecycle method.

Se o validate é chamado quando vc persiste, o validate deveria ser também na alteração, já que possui as 2 anotações.

Você esta chamando o EntityManager.merge(usuario ) na alteração ?

Já testou colocar um breakpoint no metodo validate ?

Opa… Agora começamos a se comunicar… :wink:

Sim… minha ERPException é uma unchecked exception. Ela herda RuntimeException.

Justamente… Era isso que deveria ocorrer mesmo, mas não está ocorrendo.

Sim… Estou utilizando o merge para realizar a alteração.

Não necessariamente um breakpoint mas mandei imprimir uma mensagem no método validate(), mas ele não é exibido quando realizo uma alteração, mas somente quando insiro uma nova entidade.

@braços

Agora complicou rs

Chame o EntityManager.flush() após suas modificações (merge). O call back deveria ser chamado após o flush.

crie um método novo só para testes e mova a anotacao para ele … coloque um breakPoint sei la hehehe

Pode ser um bug, mas acho improvável.

Acho que travamos, se nada der certo busque outra solução

Então… E se eu te disser que já usei o velho truque do flush() ? hehehe

Já defini dois métodos um para o @PrePersist e outro para @PreUpdate.

Já escrevi uma classe e defini um listener para a entidade. Veja abaixo:


@Entity   
@NamedQuery(name = "Usuario.findAll", query = "select u from Usuario u ORDER BY u.nome ASC")   
@Table(name = "usuario")   
@SequenceGenerator(name = "sequsuario", sequenceName = "sequsuario", allocationSize = 1, initialValue = 1) 
@EntityListeners({ UsuarioValidator.class })
public class Usuario extends AbstractEntity implements Serializable, Comparator<Usuario>, Comparable<Usuario> {
    ....
}

public class UsuarioValidator {
    @PrePersist
    @PreUpdate
    public void validate() throws ERPException  {   
        if(this.nome == null || this.nome.equals("")) {   
            throw new ERPException(MessageBundle.ACESSO_USUARIO_NOME_OBRIGATORIO);   
        }   
        if(this.senha == null || this.senha.equals("")) {   
            throw new ERPException(MessageBundle.ACESSO_USUARIO_SENHA_OBRIGATORIO);   
        }   
    }
}

E nada de funfar essa parada… :frowning:

@braços

Será que algum outro componente já deu rollback na sua transação antes de chamar o metodo de atulizar do seu SessionBean?

Tente simplificar as coisas. retire o merge(). Veja se ocorre a exceção, ou via breakpoint verifique SessionContext.getRollBackOnly() antes de executar o método.

Vai adicionando as coisas aos poucos e descubra o que estraga sua transacao