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>
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? –
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
Verwenden Sie den richtigen Transaktionsmanager für die von Ihnen verwendete Technologie. Sie verwenden den Ruhezustand, verwenden Sie also den 'HibernateTransactionManager' anstelle des' DataSourceTransactionManager'. –