2010-12-08 65 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。不好的。)