2010-12-08 113 views
0

大家好 我做了一個使用hybernate + JPA的應用程序配置,並且使用atomikos進行XA傳輸管理,並且spring 3.0和mysql是我的後端,這裏每個東西都工作正常,但是插入操作時,異常投擲transcation應該回滾,但它不會發生! 這裏是我們的應用程序小流量,我們的經理級別,我們調用businesss(在這裏我們使用Spring IOC) 我JPA事務回滾不起作用

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

      business.insertuser(); 
     } 

business.java我們正在使用一種方法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. 

} 

和我們dao.java類,我們使用一種方法insertuser(對象實體)

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

和我們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> 

和我的persistence.xml文件是

<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> 

和我配置我的JNDI在應用/ 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> 

和我的配置文件是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> 

問題在哪裏?實際上,當我試圖更新表中的某些屬性,然後transcation工作正常(回滾和提交正在發生),但是當我試圖做插入操作回滾沒有發生。

+0

你能否提供更多的實際代碼(當然,去掉任何公司特定的東西)?似乎交易在你打電話給DAO之後就被關閉並承諾了,這顯然不是你想要做的。 – 2010-12-08 13:04:53

回答

0

我看的越多,看起來就越困惑。

首先,AOP配置如何與您的實際方法相關?它配置的方式,它只會創建以「保存」或「刪除」開頭的方法以及圍繞其他任務的只讀事務。你的方法被稱爲insertDetails,所以這是行不通的。

二,您是否配置了彈簧PlatformTransactionManager?我沒有看到配置。

第三:看起來你正在爲你的類使用默認包,但是爲包com.live.webAppl中的類定義了切入點。這是你的課程真正的地方嗎?

第四:在引發異常的地方是否存在開放事務,並且插入方法是否參與該事務?如果不是,那麼它不能回滾。使用調試器和日誌輸出一起查看創建哪個事務以及插入方法是否參與。嘗試提高Atomikos的日誌級別以進行調試。

四,你卡在一個Java 1.4的代碼庫?否則,請去annotational transaction declaration。 (在你的配置和代碼中完成的很多方法看起來有點過時。)

第五,約定是使用所有小寫包名。課程以大寫字母開頭,成員和本地人小寫。這將有助於您的代碼的可讀性。(例如,Dao.insertUser()看起來像一個靜態方法調用的人誰可以閱讀的Java。不好的。)