Откат транзакции JPA не работает - PullRequest
0 голосов
/ 08 декабря 2010

Привет, я выполнил настройку приложения, используя Hybernate + JPA и Atomikos для управления трансациями XA и Spring 3.0, и MySQL - мой бэкэнд, здесь все работает нормально, однако операция вставки, когда исключение выдает транскрипцию, должна откатитьсяно этого не происходит !!здесь небольшой поток для нашего приложения, на уровне менеджера мы вызываем businesss (здесь мы используем Spring IOC) my

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>

, и я настроил свой 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 Ответ

0 голосов
/ 14 декабря 2010

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

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

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

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

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

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

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

...