2010-12-08 4 views
0

Привет всем Я сделал конфигурацию приложения, используя hybernate + JPA, и atomikos для управления трансацией XA и весной 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 (объект Object)

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> 

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

+0

Можете ли вы предоставить больше своего фактического кода (конечно же, с любыми конкретными компаниями)? Похоже, транзакция закрывается и совершается после вашего звонка в DAO, что явно не то, что вы пытаетесь сделать. – 2010-12-08 13:04:53

ответ

0

Чем больше я смотрю на это, тем больше смущает это.

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

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

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

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

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

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

Смежные вопросы