JPA事务回滚不起作用

时间:2010-12-08 12:06:46

标签: java hibernate spring jpa jta

大家好    我已经使用hybernate + JPA进行了应用程序配置,并且使用了atomikos进行XA transcation管理和spring 3.0和mysql是我的后端,这里的每个东西都工作正常然而插入操作,当异常抛出transcation时应该回滚,但它没有发生!    这是我们应用程序的一个小流程,在我们的经理级别,我们正在调用业务(这里我们使用的是Spring IOC)  我的

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(Object entity)

 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>

我在application / meta_inf / context.xml

中配置了我的jndi
  <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工作正常(回滚和提交正在发生),但是当我尝试执行插入操作回滚时没有发生。

1 个答案:

答案 0 :(得分:0)

我看的越多,它看起来就越混乱。

首先,AOP配置如何与您的实际方法相关?它的配置方式只会创建围绕以“save”或“remove”开头的方法的事务,以及围绕其他所有事务的只读事务。您的方法称为insertDetails,因此无效。

其次,您是否配置了Spring PlatformTransactionManager?我没有看到配置。

第三:看起来你正在使用类的默认包,但是为包com.live.webAppl中的类定义了切入点。这是你的课程真正的地方吗?

第四:抛出异常时是否存在开放事务,插入方法是否参与了该事务?如果没有,那么就无法回滚。将调试器与日志输出一起使用,以查看创建事务的位置以及insert方法是否参与。尝试提高Atomikos的日志级别以进行调试。

第四,你是否陷入了Java 1.4代码库?否则,请转到annotational transaction declaration。 (在配置和代码中完成的很多方法看起来都有点过时了。)

第五,惯例是使用所有小写包名称。类以大写字母开头,成员和本地小写字母。这将有助于您的代码的可读性。 (例如,Dao.insertUser()看起来像是对任何能够阅读Java的人的静态方法调用。不好。)