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

JPA Java Discussion :

[EJB3] Could not execute JDBC batch update


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut [EJB3] Could not execute JDBC batch update
    Salut,

    Tout d'abord, voici la méthode doGet() de ma servlet de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            PrintWriter out = response.getWriter();
    
            out.println("début");
            System.out.println("début*********************");
    
            User romUser = new User("rom", "rom", "rom", "rom", "rom1v@yahoo.fr", true, 500);
            Store fnacStore = new Store("FNAC", "Toulouse", "La fnac de Toulouse", null);
            Product computerProduct = new Product("computer", 100000, fnacStore, 6, "standard computer");
    
            UserFacade userFacade = EjbLocator.getLocator().getUserFacade();
    
            fnacStore.persist();
            computerProduct.persist();
            romUser.persist();
    
            romUser.setFirstName("romain");
    
             romUser.getCart().addProduct(computerProduct, 5);
    
            User newUser = new User("2e", "2e", "2e", "2e", "2e@a.c", true, 400);
            newUser.persist();
            newUser.getCart().addProduct(computerProduct, 2);
    
            // userFacade.updateUser(romUser);
            romUser.update();
    
            newUser.update();
    
            out.println(userFacade.getUser(romUser.getId()).getFirstName());
            Collection<ProductQuantity> list = userFacade.getUser(romUser.getId()).getCart().getProducts();
            out.println(list);
    
            System.out.println("ok");
        }
    }
    L'erreur se produit lorsque je fais plusieurs update dans la même page.

    update() se contente de faire un updateUser() sur l'UserFacade, qui lui fait juste un em.merge(user).

    Ce qui est très bisarre, si je vire newUser.update() ou romUser.update() uniquement, sans mettre les 2, ça marche...

    Voici l'exception.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    20:44:21,859 WARN  [JDBCExceptionReporter] SQL Error: 0, SQLState: null
    20:44:21,859 ERROR [JDBCExceptionReporter] failed batch
    20:44:21,859 ERROR [AbstractFlushingEventListener] Could not synchronize database state with session
    org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
    	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
    	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
    	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:249)
    	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
    	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
    	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    	at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:515)
    	at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:109)
    	at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:199)
    	at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:85)
    	at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177)
    	at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1181)
    	at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:134)
    	at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:87)
    	at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:175)
    	at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)
    	at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:193)
    	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    	at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
    	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    	at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
    	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    	at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
    	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:102)
    	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
    	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    	at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
    	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    	at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:214)
    	at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:79)
    	at $Proxy58.updateUser(Unknown Source)
    	at ejb.User.update(User.java:270)
    	at test.TestsUnit.doGet(TestsUnit.java:83)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    	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:228)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:174)
    	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:86)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:212)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:818)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:624)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
    	at java.lang.Thread.run(Thread.java:619)
    Caused by: java.sql.BatchUpdateException: failed batch
    	at org.hsqldb.jdbc.jdbcStatement.executeBatch(Unknown Source)
    	at org.hsqldb.jdbc.jdbcPreparedStatement.executeBatch(Unknown Source)
    	at org.jboss.resource.adapter.jdbc.CachedPreparedStatement.executeBatch(CachedPreparedStatement.java:478)
    	at org.jboss.resource.adapter.jdbc.WrappedStatement.executeBatch(WrappedStatement.java:518)
    	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)
    	... 53 more
    20:44:21,875 ERROR [[TestsUnit]] "Servlet.service()" pour la servlet TestsUnit a généré une exception
    java.lang.RuntimeException: javax.transaction.RollbackException
    	at org.jboss.aspects.tx.TxPolicy.handleEndTransactionException(TxPolicy.java:198)
    	at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:180)
    	at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)
    	at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:193)
    	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    	at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
    	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    	at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
    	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    	at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
    	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:102)
    	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
    	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    	at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
    	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    	at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:214)
    	at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:79)
    	at $Proxy58.updateUser(Unknown Source)
    	at ejb.User.update(User.java:270)
    	at test.TestsUnit.doGet(TestsUnit.java:83)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    	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:228)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:174)
    	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:86)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:212)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:818)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:624)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
    	at java.lang.Thread.run(Thread.java:619)
    Caused by: javax.transaction.RollbackException
    	at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1192)
    	at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:134)
    	at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:87)
    	at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:175)
    	... 38 more

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    La semantique du merge, ce n'est pas de faire un update : c'est d'attacher un objet à la transaction en cours (et accessoirement de faire les modifs en base si besoin). Probablement que ça foire parce que tu attaches un objet déjà attaché.

    Sinon je te recommende de faire ce genre de manips dans une transaction, soit ouverte explicement ( EntityTransaction tx = em.getTransaction()) soit implicitement (en passant par un session bean par exemple).

    Pour continuer ce n'est pas très recommendé de mettre les méthodes persist() et autres au niveau des objets du modèle (User, Product ...)

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par the-gtm
    Sinon je te recommende de faire ce genre de manips dans une transaction, soit ouverte explicement ( EntityTransaction tx = em.getTransaction())
    Où est-ce que je dois faire ça?

    EDIT: de toute façon normalement je suis dans une transaction, la preuve j'ai un RollbackException...

    Et comment conseilles-tu de faire un "update" si c'est pas avec merge?

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    Ce qui t'était conseiller c'est de séparé le coté business de ton applicationm depuis ta servlet tu accèdes à un session bean qui te présente un ensemble de méthodes.

    Ce qui t'as été également conseillé c'est de placé l'ensemble du code d'update dans une transaction doGet n'est pas gérer a un niveau transactionel par ton contener J2EE (pas de déclaration explicte par le biais des annotations)


    Tu aurais pu cependant définir d'une forme déclarative la gestion de tes transactions, et créant un TransactionManager et définissant déclarativement un ctx.begin cts.commit

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par *alexandre*
    Ce qui t'était conseiller c'est de séparé le coté business de ton applicationm depuis ta servlet tu accèdes à un session bean qui te présente un ensemble de méthodes.
    Oui, c'est ce que je faisais avant, grâce à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EjbLocator.getLocator().getProductFacade().addProduct(monProduct);
    ce qui est quand même assez lourd.
    je préfère:
    Certes, normalement pour la façade, on peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @EJB private ProductFacadeImpl maFacade;
    Mais si je mets ça j'ai une erreur de déploiement (avec ou sans le Impl).

    Citation Envoyé par *alexandre*
    Ce qui t'as été également conseillé c'est de placé l'ensemble du code d'update dans une transaction doGet n'est pas gérer a un niveau transactionel par ton contener J2EE (pas de déclaration explicte par le biais des annotations)
    Comment ça?


    Citation Envoyé par *alexandre*
    Tu aurais pu cependant définir d'une forme déclarative la gestion de tes transactions, et créant un TransactionManager et définissant déclarativement un ctx.begin cts.commit
    Effectivement, en mettant dans ma servlet un attribut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @PersistenceContext private EntityManager em;
    et en mettant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    EntityTransaction trx = em.getTransaction();
    trx.begin();
    //...
    trx.commit();
    dans mon doGet, ça a l'air de marcher...


    EDIT: ah bah en fait non, ça ne déploie même plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Illegal @PersistenceUnit on private javax.persistence.EntityManager test.TestsUnit.em :There is no default persistence unit in this deployment.
    (j'ai mis un @PersistenceContext, pas un @PersistenceUnit, qu'est-ce qu'il me raconte)


    EDIT2: Il faut faire un session bean TransactionManager, c'est ça???

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    EjbLocator.getLocator().getProductFacade().addProduct(monProduct);

    Tu ne sépares rien du tout, tu fais juste un appel.

    Etant donné que tu es dans un contexte de code managé JEE, tu peux donc accéder à un EJB session en définissant comme variable private dans ta servlet

    @EJB
    ProductFacade


    Dans ton code doGet tu peux imaginer accéder à une méthode de ta facadem qui concerne notament l'update

    par productFacate.update(product)

    Par contre il te faudra sélectionner un mode transactionel au niveau de ta facade pour ta méthode update

    1)par annotation
    2)par programmation

    Par annotation tu dois définir dans la définition de ta méthode qui doit être transactionelle

    @TransactionAttribute(TransactionAttributeType.REQUIRED)

    Je te laisse lire la documentation et API au sujet de TransactionAttributeType

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/05/2009, 12h20
  2. Réponses: 1
    Dernier message: 30/09/2008, 17h13
  3. Could not execute JDBC batch update
    Par nabil148911 dans le forum Hibernate
    Réponses: 2
    Dernier message: 08/09/2007, 01h35
  4. could not execute query
    Par nabil148911 dans le forum Hibernate
    Réponses: 3
    Dernier message: 20/07/2007, 14h37
  5. [Hibernate][error] Could not execute JDBC batch update
    Par CPI_en_mousse dans le forum Hibernate
    Réponses: 7
    Dernier message: 01/06/2007, 09h41

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