2010-12-08 32 views
0

Salut tous J'ai fait une configuration d'application en utilisant hybernate + JPA, et atomikos pour XA transcation management et spring 3.0 et mysql est mon backend, ici tout fonctionne bien mais opération d'insertion, sauf exception est de jeter la transcation devrait revenir en arrière, mais il ne se passe pas !! voici un petit flux pour notre application, dans notre niveau de gestion que nous appelons le businesss (ici, nous utilisons du CIO Spring) monL'annulation de transaction JPA ne fonctionne pas

Manager.java   
     insertuser() 
     { 
     //here we are getting transcation support from spring. 

      business.insertuser(); 
     } 

business.java nous utilisons une méthode insertuser()

insertuser() 
    { 
    Tauser taUser=new Tauser(); 
    taUser.setUsername("Maya"); 
    taUser.setPassword("*****")  
    Dao.insertDetails(taUser); 
    throw new NullPointerException("checking transcation management"); 
    // because of this exception throwing,it should rollback right, 
    but its not happening.The property's are commiting in to the table. 

} 

et notre classe dao.java nous utilisons une méthode insertuser (entité objet)

void insertDetails(Object entity) 
     { 
     this.getJpaTemplate().persist(entity);  
     } 

et notre orm.xml

 <entity class="TaUser" name="TaUser"> 
<table name="ta_user" /> 
<attributes> 
    <id name="userId"> 
     <column name="USER_ID" /> 
     <generated-value strategy="AUTO" /> 
    </id> 
    <basic name="userName"> 
     <column name="USER_NAME" length="50" /> 
    </basic> 
    </attributes> 

et mon fichier persistence.xml est

<persistence-unit name="shop" transaction-type="JTA"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:comp/env/jdbc/shobWeb</jta-data-source> 
      <mapping-file>META-INF/orm.xml</mapping-file> 
      <class>TaUser</class> 
      --------- 
      --------- 
      --------- 
      <properties> 
      <property name="hibernate.transaction.manager_lookup_class" 
      value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"/> 
      </properties>  
    </persistence-unit> 
    </persistence> 

et je configuré mon JNDI en application/meta_inf/context.xml

<Resource name="jdbc/shobWeb" auth="Container" 
         driverClassName="com.mysql.jdbc.Driver" 
         user="root" 
         password="root" 
         type="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" 
         factory="com.mysql.jdbc.jdbc2.optional.MysqlDataSourceFactory" 
         url="jdbc:mysql://localhost:3306/shobWebSample" 
         explicitUrl="true" 
         pinGlobalTxToPhysicalConnection="true" 
         ></Resource> 

et mon fichier de configuration est config.xml

<beans:bean id="Manager" 
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
    <beans:property name="transactionManager"> 
     <beans:ref bean="transactionManager" /> 
    </beans:property> 
    <beans:property name="target"> 
     <beans:ref local=" ManagerTarget" /> 
    </beans:property> 
    <beans:property name="transactionAttributes"> 
     <beans:props> 
      <beans:prop key="*">PROPAGATION_REQUIRED</beans:prop> 
     </beans:props> 
    </beans:property> 
</beans:bean> 

<beans:bean id="ManagerTarget" 
    class="Manager"> 
    <beans:property name="Business" ref="Business" /> 
</beans:bean> 
<beans:bean id="Business" class="PaymentsBusiness"> 
    <beans:property name="Dao" ref=" Dao" />    
</beans:bean> 

<beans:bean id="Dao" 
    class=" Dao"> 
    <beans:property name="jpaTemplate"> 
     <beans:ref bean="jpaTemplate" /> 
    </beans:property> 
</beans:bean> 

<beans:bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate"> 
    <beans:property name="entityManagerFactory"> 
     <beans:ref bean="entityManagerFactory" /> 
    </beans:property> 
</beans:bean> 


<beans:bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
<beans:property name="persistenceUnitName" value="shop" /> 
    <beans:property name="jpaVendorAdapter"> 
     <beans:bean 
      class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <beans:property name="generateDdl" value="false" /> 
      <beans:property name="showSql" value="true" /> 
     </beans:bean> 
    </beans:property> 
    <beans:property name="persistenceXmlLocation"> 
     <bean:value>classpath:META-INF/persistence.xml</beans:value> 
    </beans:property> 
</beans:bean> 

où est le problème? En fait, lorsque j'essaie de mettre à jour une propriété dans une table, la transcation fonctionne correctement (annulation et validation), mais lorsque j'essaie de faire, l'annulation de l'opération d'insertion ne se produit pas.

+0

Pouvez-vous fournir plus de votre code actuel (avec des choses spécifiques à l'entreprise supprimées bien sûr)? On dirait que la transaction est fermée et engagée après votre appel à l'OAC, ce qui n'est clairement pas ce que vous essayez de faire. –

+0

Plus de code aidera. Surtout comment vous gérez les frontières de transaction? Il existe également une raison spécifique d'utiliser orm.xml. Vous ne pouvez pas utiliser l'annotation? – lalit

+0

Impossible de dire ce qui se passe sans aucun journal. Les transactions printanières génèrent beaucoup d'informations de journalisation en mode débogage. Ajoutez 'log4j.logger.org.springframework.transaction = DEBUG' à votre config log4j (ou l'équivalent de ce que vous utilisez pour la consignation), et voyez si les transactions sont réellement utilisées. C'est votre meilleure option pour déboguer ce genre de choses. Si vous avez encore des problèmes, mettez à jour votre message avec les informations. (En passant, vous pouvez modifier votre message pour ajouter des informations au lieu de l'afficher comme réponse.) – Henning

Répondre

0

Plus je regarde cela, plus il semble confus.

Premièrement, comment la config AOP se rapporte-t-elle à vos méthodes actuelles? De la façon dont il est configuré, il créera seulement des transactions autour des méthodes commençant par "save" ou "remove", et des transactions en lecture seule autour de tout le reste. Votre méthode s'appelle insertDetails, cela ne fonctionnera donc pas.

Deuxièmement, avez-vous configuré un ressort PlatformTransactionManager? Je ne vois pas la configuration. Troisième: Il semble que vous utilisiez le package par défaut pour vos classes, mais que vous définissiez le pointcut pour les classes dans un package com.live.webAppl. Est-ce que c'est vraiment là où tes cours sont? Quatrièmement: Y at-il une transaction ouverte au point où l'exception est levée, et la méthode d'insertion a-t-elle participé à cette transaction? Sinon, il ne peut pas revenir en arrière. Utilisez le débogueur avec la sortie du journal pour voir où la transaction est créée et si la méthode insert participe. Essayez de relancer le niveau de journalisation d'Atomikos pour le déboguer.

Quatrièmement, êtes-vous coincé dans une base de code Java 1.4? Sinon, optez pour annotational transaction declaration. (Beaucoup de choses sont faites dans votre config et le code a l'air un peu daté.)

Cinquièmement, la convention est d'utiliser tous les noms de paquets en minuscules. Les cours commencent par une lettre majuscule, les membres et les locaux en minuscules. Cela aidera la lisibilité de votre code.(Par exemple, Dao.insertUser() ressemble à un appel de méthode statique pour tous ceux qui peuvent lire Java.Pas bon.)