Откат транзакции JPA не работает

Привет всем, что я сделал настройку приложения, используя hybernate + JPA и Atomikos для управления трансациями XA и Spring 3.0, и MySQL - мой бэкэнд, здесь все работает нормально, однако операция вставки, когда исключение выдает преобразование, должна откатиться, но это не происходит!! Вот небольшой поток для нашего приложения, на уровне менеджера мы вызываем businesss (здесь мы используем 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 (объект сущности)

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

и мой конфигурационный файл - 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>

где проблема? На самом деле, когда я пытаюсь обновить какое-либо свойство в таблице, транскрипция работает нормально (происходит откат и фиксация), но когда я пытаюсь выполнить операцию вставки, отката не происходит.

1 ответ

Чем больше я смотрю на это, тем более запутанным это выглядит.

Во-первых, как конфигурация AOP связана с вашими реальными методами? Как это настроено, он будет создавать транзакции только вокруг методов, начинающихся с "сохранить" или "удалить", и транзакции только для чтения вокруг всего остального. Ваш метод называется insertDetails, так что это не сработает.

Во-вторых, у вас есть весна PlatformTransactionManager сконфигурировано? Я не вижу конфигурации.

Третье: похоже, вы используете пакет по умолчанию для своих классов, но определили pointcut для классов в пакете com.live.webAppl, Это где ваши классы на самом деле?

В-четвертых: существует ли открытая транзакция в точке, где генерируется исключение, и участвовал ли метод вставки в этой транзакции? Если нет, то он не может выполнить откат. Используйте отладчик вместе с выводом журнала, чтобы увидеть, где создается транзакция и участвует ли метод вставки. Попробуйте также поднять уровень лога Atomikos для отладки.

В-четвертых, вы застряли в кодовой базе Java 1.4? В противном случае перейдите к объявлению аннотационной транзакции. (Многие способы, которые делаются в вашей конфигурации, и код выглядят немного устаревшими.)

В-пятых, соглашение заключается в использовании всех строчных имен пакетов. Занятия начинаются с заглавной буквы, члены и местные жители строчными. Это поможет удобочитаемости вашего кода. (Например, Dao.insertUser() выглядит как статический вызов метода для любого, кто может читать Java. Нехорошо.)

Другие вопросы по тегам