2017-05-12 3 views
0

Ich habe ein sehr seltsames Problem und suche hier nach der Lösung. Ich habe viel Zeit damit verbracht, Artikel und andere Fragen zu SO zu lesen, aber kein Glück. Ich verwende @Transactional Annotation in meiner Beispielanwendung von Spring 3 und Hibernate 3 wie unten gezeigt. In der letzten Zeile der Methode werfe ich explizit NullPointerException wie unten gezeigt.Spring @Transaction nicht zurückrollen

package com.mkyong.common; 

import org.apache.log4j.Logger; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import com.mkyong.stock.bo.StockBo; 
import com.mkyong.stock.model.Stock; 

@Service("stockService") 
public class StockServiceImpl { 

    final static Logger logger = Logger.getLogger(StockServiceImpl.class); 


     @Transactional(rollbackFor ={ NullPointerException.class} ) 
     public void createNewStock(StockBo stockBo) { 
      /** insert **/ 
      Stock stock = new Stock(); 
      String code = "xee"; 
      stock.setStockCode(code); 
      stock.setStockName(code); 
      stockBo.save(stock); 

      logger.debug("#################### After Save ##########################"); 
      throw new NullPointerException(); 

     } 

} 

jedoch diese Transaktion rollt nicht zurück und immer Datenbank commiting obwohl NullPointerException geworfen wird. Unten ist mein Anwendungskontext Datei

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    "> 

    <!-- Database Configuration --> 
    <import resource="../database/DataSource.xml" /> 
    <import resource="../database/Hibernate.xml" /> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <!-- Auto scan the components --> 
    <context:component-scan base-package="com.mkyong.stock" /> 
    <bean 
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager" 
     id="transactionManager"> 
     <property name="dataSource" ref="dataSource"></property> 
    </bean> 
</beans> 
+0

Es mag trivial klingen, aber ist die Klasse mit createNewStock im Paket 'com.mkyong.stock'. Wenn Ja, ist es für den Komponenten-Scan detektierbar, d. H. Mit & ldquor; @ Component "oder irgendeiner seiner Varianten markiert? –

+1

Mai stockBo.save (Bestand); erstellt eine unabhängige Transaktion. Gibt es eine @ Transactional Annotation für diese Methode? Wenn ja, überprüfen Sie die Ausbreitungsstufe – Afridi

+1

Verwenden Sie den richtigen Transaktionsmanager für die von Ihnen verwendete Technologie. Sie verwenden den Ruhezustand, verwenden Sie also den 'HibernateTransactionManager' anstelle des' DataSourceTransactionManager'. –

Antwort

1

Ausgehend von Ihrer Konfiguration verwenden Sie Hibernate. Sie verwenden jedoch den Transaktionsmanager, der ausschließlich für die einfache JDBC-Verwendung vorgesehen ist.

Um eine ordnungsgemäße Transaktionsverwaltung zu haben, müssen Sie das PlatformTransactionManager verwenden, das zu Ihrer Persistenztechnologie gehört. In Ihrem Fall sollten Sie die HibernateTransactionManager anstelle der DataSourceTransactionManager verwenden.

<bean id="transactionManager" class="org.springframework.hibernate5.HibernateTransactionManager> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

Hinweis: Diese für Hibernate5 ist (siehe die Paketnamen) verwenden, um die eine, die Ihre Version von Hibernate paßt.

0

Vergewissern Sie sich, dass die Klasse, die die Methode enthält im Anwendungskontext ist nicht in dem Web-Anwendungskontext (einfach: die Elternklasse des Verfahrens einen Dienst sein soll, Repository etc kein Controller). Überprüfen Sie auch, ob Sie die @Transactional Annotation aus dem richtigen Federpaket importieren.

+0

Es ist bereits mit @Service gekennzeichnet – ajay

0

Verwenden Sie nur @Transactional Annotation ist genug. Sie benötigen RollbackFor nicht, um Rollback auf NullPointerException durchzuführen. Transaktionen mit @Transactional Annotation werden standardmäßig auf RuntimeException festgelegt. Sie sollten rollbackFor nur hinzufügen, wenn Sie auf markierte Ausnahmen zurücksetzen möchten.

Verwandte Themen