IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java EE Discussion :

TransactionRolledbackedException [EJB]


Sujet :

Java EE

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 22
    Points : 18
    Points
    18
    Par défaut TransactionRolledbackedException
    Bonjour,

    voila mon architecture, elements et <type de connections> :

    Client (classe Java) <remote> SessionFacade (Session bean Stetefull) <local> SessionFacadeUser (session bean stateless) <local> User (entity bean)

    J'ai un probleme lorsque je cree un ejb user avec une cle primaire deja existante ! (logique que ca ne passe pas )
    En fait, Je m'attendant au niveau de ma SessionFacadeUser a recuperer une EJBException, une CreateException, ou quelque chose comme ca mais en fait, pas du tout je ne recois aucune exception

    par contre, au niveau de mon client, je recois une javax.transaction.TransactionRolledbackException
    Cette exception encapsule une javax.ejb.DuplicateKeyException. (Je joints l'exception complete a la fin du post)

    De plus, au niveau du server (weblogic), dans les logs et sur la console, je recupere ce petit bout d'exception qui, je pense, permet de comprendre un peu le phenomene :

    Exception occurred during commit of transaction Name=[EJB orchestra.AdminSessionFacadeBean.userNew(orchestra.TOrcUsersDto)],Xid=BEA1-003ED09F4921C5674FAB(11923400),Status=Rolledback. [Reason=weblogic.utils.NestedRuntimeException: Error writing from beforeCompletion - with nested exception:
    je pense donc que l'exception est lancee au moment ou le server fait un commit de ses ejbs, et ce serait une raison pour laquelle je n'arrive pas a la catcher au niveau des SessionsBeans...
    Par contre, comment ca se fait que je puisse la recuperer au niveau du client... ca c'est une autre question

    En tout cas, j'aimerai savoir comment je peux faire :
    forcer le commit dans ma SessionFacadeUser pour recuperer l'exception a ce moment la,
    tester manuellement si la cle primaire existe deja avant de creer mon User,
    ...

    Si quelqu'un a deja eu le probleme, ou aurait une ca serait super cool

    je met la l'exception complete :
    (a savoir : orchestra.AdminSessionFacade est ma SessionFacade, userNew une methode de cette classe qui ne fait que lancer la methode de creation d'un user sur la SessionFacadeUser, enfin orchestra.test.TestAdminByPortal est mon client java)

    javax.transaction.TransactionRolledbackException: Exception while commiting Tx : Name=[EJB orchestra.AdminSessionFacadeBean.userNew(orchestra.TOrcUsersDto)],Xid=BEA1-003ED09F4921C5674FAB(11923400),Status=Rolled back. [Reason=weblogic.utils.NestedRuntimeException: Error writing from beforeCompletion - with nested exception:

    [javax.ejb.DuplicateKeyException: Bean with primary key: 'hvillalonga' already exists.]],numRepliesOwedMe=0,numRepliesOwedOthers=0,seconds since begin=0,seconds left=30,XAServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(ServerResourceInfo[weblogic.jdbc.wrapper.JTSXAResourceImpl]=(state=rolledback,assigned=WLDEVADMIN),xar=weblogic.jdbc.wrapper.JTSXAResourceImpl@9139fc),SCInfo[ADA+WLDEVADMIN]=(state=rolledback),properties=({weblogic.transaction.name=[EJB orchestra.AdminSessionFacadeBean.userNew(orchestra.TOrcUsersDto)], weblogic.jdbc=t3://172.16.132.29:7001}),local properties=({modifiedListeners=[weblogic.ejb20.internal.TxManager$TxListener@1bf756b]}),OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=WLDEVADMIN+172.16.132.29:7001+ADA+t3+, XAResources={},NonXAResources={})],CoordinatorURL=WLDEVADMIN+172.16.132.29:7001+ADA+t3+): javax.ejb.DuplicateKeyException: Bean with primary key: 'hvillalonga' already exists.

    at weblogic.ejb20.manager.BaseEntityManager.executeInsertStmt(BaseEntityManager.java:584)

    at weblogic.ejb20.manager.BaseEntityManager.executeDBOperations(BaseEntityManager.java:435)

    at weblogic.ejb20.internal.TxManager$TxListener.executeDBOperations(TxManager.java:596)

    at weblogic.ejb20.internal.TxManager$TxListener.executeDBOperationsDriver(TxManager.java:571)

    at weblogic.ejb20.internal.TxManager$TxListener.beforeCompletion(TxManager.java:731)

    at weblogic.transaction.internal.ServerSCInfo.callBeforeCompletions(ServerSCInfo.java:1010)

    at weblogic.transaction.internal.ServerSCInfo.startPrePrepareAndChain(ServerSCInfo.java:115)

    at weblogic.transaction.internal.ServerTransactionImpl.localPrePrepareAndChain(ServerTransactionImpl.java:1142)

    at weblogic.transaction.internal.ServerTransactionImpl.globalPrePrepare(ServerTransactionImpl.java:1868)

    at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:250)

    at weblogic.transaction.internal.ServerTransactionImpl.commit(ServerTransactionImpl.java:221)

    at weblogic.ejb20.internal.BaseEJBObject.postInvoke(BaseEJBObject.java:289)

    at orchestra.AdminSessionFacade_xno66q_EOImpl.userNew(AdminSessionFacade_xno66q_EOImpl.java:520)

    at orchestra.AdminSessionFacade_xno66q_EOImpl_WLSkel.invoke(Unknown Source)

    at weblogic.rmi.internal.activation.ActivatableServerRef.invoke(ActivatableServerRef.java:87)

    at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:409)

    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:353)

    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:144)

    at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:404)

    at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:30)

    at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)

    at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)

    --------------- nested within: ------------------

    weblogic.utils.NestedRuntimeException: Error writing from beforeCompletion - with nested exception:

    [javax.ejb.DuplicateKeyException: Bean with primary key: 'hvillalonga' already exists.]

    at weblogic.ejb20.internal.TxManager$TxListener.beforeCompletion(TxManager.java:743)

    at weblogic.transaction.internal.ServerSCInfo.callBeforeCompletions(ServerSCInfo.java:1010)

    at weblogic.transaction.internal.ServerSCInfo.startPrePrepareAndChain(ServerSCInfo.java:115)

    at weblogic.transaction.internal.ServerTransactionImpl.localPrePrepareAndChain(ServerTransactionImpl.java:1142)

    at weblogic.transaction.internal.ServerTransactionImpl.globalPrePrepare(ServerTransactionImpl.java:1868)

    at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:250)

    at weblogic.transaction.internal.ServerTransactionImpl.commit(ServerTransactionImpl.java:221)

    at weblogic.ejb20.internal.BaseEJBObject.postInvoke(BaseEJBObject.java:289)

    at orchestra.AdminSessionFacade_xno66q_EOImpl.userNew(AdminSessionFacade_xno66q_EOImpl.java:520)

    at orchestra.AdminSessionFacade_xno66q_EOImpl_WLSkel.invoke(Unknown Source)

    at weblogic.rmi.internal.activation.ActivatableServerRef.invoke(ActivatableServerRef.java:87)

    at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:409)

    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:353)

    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:144)

    at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:404)

    at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:30)

    at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)

    at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)

    ; nested exception is:
    weblogic.utils.NestedRuntimeException: Error writing from beforeCompletion - with nested exception:

    [javax.ejb.DuplicateKeyException: Bean with primary key: 'hvillalonga' already exists.]

    at weblogic.rjvm.BasicOutboundRequest.sendReceive(BasicOutboundRequest.java:108)

    at weblogic.rmi.internal.activation.ActivatableRemoteRef.invoke(ActivatableRemoteRef.java:83)

    at orchestra.AdminSessionFacade_xno66q_EOImpl_811_WLStub.userNew(Unknown Source)

    at orchestra.test.TestAdminByPortal.main(TestAdminByPortal.java:213)

    Caused by: weblogic.utils.NestedRuntimeException: Error writing from beforeCompletion - with nested exception:

    [javax.ejb.DuplicateKeyException: Bean with primary key: 'hvillalonga' already exists.]

    at weblogic.ejb20.internal.TxManager$TxListener.beforeCompletion(TxManager.java:743)

    at weblogic.transaction.internal.ServerSCInfo.callBeforeCompletions(ServerSCInfo.java:1010)

    at weblogic.transaction.internal.ServerSCInfo.startPrePrepareAndChain(ServerSCInfo.java:115)

    at weblogic.transaction.internal.ServerTransactionImpl.localPrePrepareAndChain(ServerTransactionImpl.java:1142)

    at weblogic.transaction.internal.ServerTransactionImpl.globalPrePrepare(ServerTransactionImpl.java:1868)

    at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:250)

    at weblogic.transaction.internal.ServerTransactionImpl.commit(ServerTransactionImpl.java:221)

    at weblogic.ejb20.internal.BaseEJBObject.postInvoke(BaseEJBObject.java:289)

    at orchestra.AdminSessionFacade_xno66q_EOImpl.userNew(AdminSessionFacade_xno66q_EOImpl.java:520)

    at orchestra.AdminSessionFacade_xno66q_EOImpl_WLSkel.invoke(Unknown Source)

    at weblogic.rmi.internal.activation.ActivatableServerRef.invoke(ActivatableServerRef.java:87)

    at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:409)

    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:353)

    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:144)

    at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:404)

    at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:30)

    at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)

    at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)

  2. #2
    Membre confirmé
    Avatar de bmoussaud
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2003
    Messages : 218
    Points : 555
    Points
    555
    Par défaut
    tu peux utiliser au niveau de ton ejb entity ou ton session local un autre mode de transaction. Tu dois etre dans ton Descripteur de déploiement en required et bien passe à en required new pour indiquer au container que tu désires activer une nouvelle transaction pour cette méthode

    plus d'info sur (us) : http://www.ejbtut.com/EjbTransactions.jsp

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 30
    Points : 22
    Points
    22
    Par défaut
    Voici un petit article qui pourrait t'aider :
    http://www.theserverside.com/discuss...hread_id=15206

    Alexis ;-)

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Merci,

    Je n'ai pas encore eu le temps de lire vos liens, mais le probleme est resolu en changeant le type de transaction
    Je pense meme avoir compris tout le fonctionnement et le pourquoi du comment ! donc c'est plutot super cool !
    Encore merci

    ciao

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo