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

Hibernate Java Discussion :

Probleme Hibernate :Execution du commit


Sujet :

Hibernate Java

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Probleme Hibernate :Execution du commit
    Bonjour à tous,


    J'ai un problème au niveau de l'exécution du commit;
    Ci-dessous est le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    String requeteSupp= "delete from table " +
                    "    where table.id= "+idTable;
     
    Session sess = this.getSession();
     
    Transaction tx = sess.beginTransaction();
     
            try {
                tx.commit();
                    } catch (Exception e) {
                tx.rollback();
            }
    La suppression s'effectue mais on aura un message d'erreur:

    org.springframework.transaction.TransactionSystemException: Could not roll back Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:618)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:800)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:777)
    at org.springframework.test.AbstractTransactionalSpringContextTests.endTransaction(AbstractTransactionalSpringContextTests.java:359)
    at org.springframework.test.AbstractTransactionalSpringContextTests.onTearDown(AbstractTransactionalSpringContextTests.java:287)
    at org.springframework.test.AbstractSingleSpringContextTests.tearDown(AbstractSingleSpringContextTests.java:144)
    at junit.framework.TestCase.runBare(TestCase.java:140)
    at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:76)
    at junit.framework.TestResult$1.protect(TestResult.java:110)
    at junit.framework.TestResult.runProtected(TestResult.java:128)
    at junit.framework.TestResult.run(TestResult.java:113)
    at junit.framework.TestCase.run(TestCase.java:124)
    at junit.framework.TestSuite.runTest(TestSuite.java:232)
    at junit.framework.TestSuite.run(TestSuite.java:227)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:81)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
    Caused by: org.hibernate.TransactionException: Transaction not successfully started
    at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:149)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:615)
    ... 20 more


    Je pense que le double appel au COMMIT est à l'origine de cet erreur.

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    Il semblerait que tu utilises Spring avec ces facilités pour la gestion des transactions. Tu n'as donc à gérer les transactions. Il faut enlever les lignes qui concerne les transactions.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    J'ai enlevé la transaction mais ça n'as pas marché.
    En fait j'utilise une base de données MySQL.
    Le "storage engine" de la table en question est "innoDB".
    Quand je le modifie en "MyISAM" çà fonctionne très bien sans l'utilisation de transactions.
    Mais avec le "innoDB" ca ne fonctionne pas.

  4. #4
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    Si tu veux utiliser Spring avec Hibernate. Il faut bien vérifier que ta configuration est correcte.

    Déjà vérifie le dialect d'Hibernate, si tu utilises innoDB, il est différent que MyISAM.

    Ensuite regarde la configuration des transactions :
    http://static.springframework.org/sp...ansaction.html

    Cela devrait donner quelque chose comme ça (copier/coller) de la doc :

    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
     
    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:mysql://localhost/"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
      </bean>
     
      <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource"/>
        <property name="mappingResources">
          <list>
            <value>product.hbm.xml</value>
          </list>
        </property>
        <property name="hibernateProperties">
          <value>
            hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
          </value>
        </property>
      </bean>
     
    <bean id="myTxManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="mySessionFactory"/>
      </bean>
     
    <tx:advice id="txAdvice" transaction-manager="txManager">
    		<tx:attributes>
    			<tx:method name="get*" read-only="true" />
    			<tx:method name="*" />
    		</tx:attributes>
    	</tx:advice>
     
    <aop:config>
    		<aop:pointcut id="txMethods" expression="execution(* com.xyz.foo.services.*.*(..))" />
    		<aop:advisor advice-ref="txAdvice" pointcut-ref="txMethods" />
    	</aop:config>

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Tu n'utiliserais pas une connexion en auto-commit ?

    On peut voir ton fichier hibernate.cfg.xml ?

    A+

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Tu n'utiliserais pas une connexion en auto-commit ?

    On peut voir ton fichier hibernate.cfg.xml ?

    A+
    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
     
    <beans xmlns="http://www.springframework.org/schema/beans">
     
         <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <list>
                    <value>classpath:jdbc.properties</value>
                </list>
            </property>
         </bean>
     
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="${jdbc.driverClassName}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
            <property name="maxActive" value="100"/>
            <property name="maxWait" value="1000"/>
            <property name="poolPreparedStatements" value="true"/>
            <property name="defaultAutoCommit" value="true"/>
        </bean>
     
     <!-- Hibernate SessionFactory -->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
            <property name="hibernateProperties">
                <value>
                    hibernate.hbm2ddl.auto=update
                    hibernate.dialect=${hibernate.dialect}
                    hibernate.query.substitutions=true 'Y', false 'N'
                    hibernate.cache.use_second_level_cache=true
                hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
                </value>
     
            </property>
        </bean>
     
     
        <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
     
     
    <!-- =================================================================== -->
        <!-- AOP: Configuration and Aspects                                      -->
        <!-- =================================================================== -->
        <aop:config>
            <aop:advisor id="userManagerTx" advice-ref="userManagerTxAdvice" pointcut="execution(* *..service.UserManager.*(..))" order="0"/>        
            <aop:advisor id="userManagerSecurity" advice-ref="userSecurityAdvice" pointcut="execution(* *..service.UserManager.saveUser(..))" order="1"/>
            <aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* *..service.*Manager.*(..))" order="2"/>
        </aop:config>
     
        <!-- Enable @Transactional support -->
        <tx:annotation-driven/>
     
        <!-- Fix bug in Spring 2.0.6: <a href="http://issues.appfuse.org/browse/APF-887" target="_blank">http://issues.appfuse.org/browse/APF-887</a> -->
        <bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf" dependency-check="none" lazy-init="false">
            <property name="transactionManager" ref="transactionManager"/>
        </bean>
     
        <!-- Enable @AspectJ support -->
        <aop:aspectj-autoproxy/>
     
        <!-- Enable @Configured support -->
        <aop:spring-configured/>
     
        <tx:advice id="txAdvice">
            <tx:attributes>
                <!-- Read-only commented out to make things easier for end-users -->
                <!-- <a href="http://issues.appfuse.org/browse/APF-556" target="_blank">http://issues.appfuse.org/browse/APF-556</a> -->
                <!--tx:method name="get*" read-only="true"/-->
                <tx:method name="*"/>
            </tx:attributes>
        </tx:advice>
     
    </beans>
     
    --------------------------------------  
     
     
    jdbc.properties:
     
    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/MaBase?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8
    jdbc.username=admin
    jdbc.password=admin
    hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate.connection.driver_class=com.mysql.jdbc.Driver

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Peux-tu essayer sans auto-commit ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <property name="defaultAutoCommit" value="false"/>
    A+

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Le dysfonctionnement de auto-commit m'a généré un autre problème qui est celui du "merge".

    cad: qu'un simple appel à la methode merge(); ne modifie rien au niveau de la base de données (seulement avec dialect d'Hibernate:InnoDB, car ça fonctionne avec MyISAM).

    malgré qu'au niveau de la configuration j'ai mis:
    <property name="defaultAutoCommit" value="true"/>


    J'ai eu une solution mais qui n'est pas prof:
    Le code est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
           try {
                this.getSession().connection().setAutoCommit(true);
            super.getHibernateTemplate().merge(object);
                    this.getSession().connection().setAutoCommit(false);
           } catch (Exception e) {
     
        }
    quelqu'un a une solution pour le fonctionnement de auto-commit?

    Merci d'avance!!

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Quel est le problème de merge ?

    Normalement, il faudrait l'utiliser comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonEntity entity = session.merge(sourceEntity);
    Pour ce qui est de MyISAM, elle ne gère pas les transactions, donc, c'est un peu normal que ça fonctionne comme avec auto-commit=true...

    A+

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Quel est le problème de merge ?

    Normalement, il faudrait l'utiliser comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonEntity entity = session.merge(sourceEntity);
    Pour ce qui est de MyISAM, elle ne gère pas les transactions, donc, c'est un peu normal que ça fonctionne comme avec auto-commit=true...

    A+


    Si on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    MonEntity entity = session.merge(sourceEntity);
     
    puis on liste tous les tuples existants dans la table. On trouve que le nouveau tuple est bien existant.
    cad:
     
    MonEntity entity = session.merge(sourceEntity);
    List<MonEntity> liste = this.myManager.getAll();
    for(MonEntity me:liste){
    System.out.println("me : "+me.getId());
    }
    On aura une liste de tous les tuples existants dans la base et le nouveau tuple ajouté.
    Mais si on vérifie dans la base, on trouve que le nouveau tuple n'est pas persisté.
    Cad, il y a pas d'appel à la méthode commit();

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    D'accord, je n'avais pas compris ton problème.
    Tu as "oublié" quelques étapes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    Transaction tx = session.beginTransaction();
    MonEntity entity = session.merge(sourceEntity);
    tx.commit();
    ...

  12. #12
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    Je pense que ta configuration est tout simplement buggué :

    1. Retire cet immonde auto-commit
    2. Spring gère les transactions donc tu n'as pas à faire de commit. Tu utilises deux méthodes pour la gestion des transactions : une par intercepteur avec l'ensemble des méthodes des classes définit (<aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* *..service.*Manager.*(..))" order="2"/>). Puis tu as activé la possibilité d'utiliser les annotations.

    Il faut donc que tu vérifies que ta classe soit annoté soit qu'elle fasse partit du pointcut de managerTx.


    Note: Contrairement à ce qui a été dit il NE faut PAS mettre le code relatif aux transactions. C'est Spring qui gère cela de manière AUTOMATIQUE.

Discussions similaires

  1. probleme d'execution appli sous HIBERNATE
    Par taouja dans le forum Hibernate
    Réponses: 0
    Dernier message: 24/03/2009, 03h07
  2. Probleme d'execution d'une requete avec un Count
    Par PrinceMaster77 dans le forum ASP
    Réponses: 4
    Dernier message: 23/06/2004, 10h33
  3. [Process] Probleme d'execution d'un prog c dans un prog java
    Par Elmilouse dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 08/06/2004, 14h26
  4. Problème d'exécution
    Par Smaugg dans le forum Linux
    Réponses: 22
    Dernier message: 26/04/2004, 09h34
  5. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50

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