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

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

and my persistence.xml file is

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

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


person unknown    schedule 08.12.2010    source источник
comment
Можете ли вы предоставить больше вашего фактического кода (конечно, с удалением любых материалов, специфичных для компании)? Похоже, что транзакция закрывается и фиксируется после вашего обращения к DAO, что явно не то, что вы пытаетесь сделать.   -  person Jim Tough    schedule 08.12.2010
comment
Больше кода поможет. Особенно, как вы справляетесь с границами транзакций? Также есть ли конкретная причина для использования orm.xml. Вы не можете использовать аннотацию?   -  person lalit    schedule 08.12.2010
comment
Без логов невозможно сказать, что происходит. Транзакции Spring выводят много информации журнала в режиме отладки. Добавьте log4j.logger.org.springframework.transaction=DEBUG в свою конфигурацию log4j (или эквивалент того, что вы используете для ведения журнала) и посмотрите, действительно ли используются транзакции. Это лучший вариант для отладки подобных вещей. Если у вас все еще есть проблемы, обновите свой пост с информацией. (Кстати, вы можете отредактировать свой пост, чтобы добавить информацию, а не публиковать его как ответ.)   -  person Henning    schedule 10.12.2010


Ответы (1)


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

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

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

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

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

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

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

person Henning    schedule 14.12.2010