Wie zu konfigurieren, die mehrere Transaktions-Manager mit Feder + DBUnit + JUnit

In einer nussschale

Meine Befehlszeile Java-Anwendung kopiert die Daten aus einer Datenquelle zu einem anderen ohne Verwendung von XA. Ich konfiguriert haben zwei getrennte Datenquellen und würde wie ein JUnit-test, können rollback-Daten auf beiden Datenquellen. Ich benutze DBUnit zum laden von Daten in die "source" - Datenbank, aber ich kann nicht das für den ein rollback ausgeführt. Ich kann das "Ziel" datasource für den ein rollback ausgeführt.

Mein Code

Angesichts dieser config...

<tx:annotation-driven />

<!-- note the default transactionManager name on this one -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource"     ref="dataSourceA" />
</bean>

<bean id="transactionManagerTarget" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource"     ref="dataSourceB" />
</bean>

und diesen code...

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:resources/spring-context.xml",
                                "classpath:resources/spring-db.xml"})  
@Transactional
@TransactionConfiguration(transactionManager = "transactionManagerTarget", defaultRollback = true) 
public class MyIntegrationTest {

    @Autowired
    private MyService service;

    @Autowired
    @Qualifier("dataSourceA")
    private DataSource dataSourceA;

    private IDataSet loadedDataSet;

    /**
     * Required by DbUnit
     */
    @Before
    public void setUp() throws Exception {
        SybaseInsertIdentityOperation.TRUNCATE_TABLE.execute(getConnection(), getDataSet());
        SybaseInsertIdentityOperation.INSERT.execute(getConnection(), getDataSet());
    }

    /**
     * Required by DbUnit
     */
    protected IDataSet getDataSet() throws Exception {
        loadedDataSet = DbUnitHelper.getDataSetFromFile(getConnection(), "TestData.xml");
        return loadedDataSet;
    }

    /**
     * Required by DbUnit
     */
    protected IDatabaseConnection getConnection() throws Exception{
        return new DatabaseConnection(dataSourceA.getConnection());
    }   

    @Test
    public void testSomething() {

        //service.doCopyStuff();

    }

}

Das problem wie ich es sehe, ist, dass @TransactionConfiguration nur Staaten, die Ziel-Datenquelle damit ein rollback. DBUnit wird übergeben dataSourceA explizit und nimmt die Standard-Transaktions-manager namens transactionManager (ich bin mir nicht sicher, wie), die noch nicht gesagt wurde, für den ein rollback ausgeführt.

Frage

Wie kann ich feststellen, sowohl Transaktions-Manager, rollback?

Kann ich mit einer einzigen Transaktion-manager, wenn meine Datenquellen unterstützen keine XA-Transaktionen?

Hinweis: Die Anwendung erfordert keine Transaktions-manager auf dataSourceA, wenn in der Produktion laufen, da es nur read-only. Dieses Problem ist bei meinen tests Klassen nur.

InformationsquelleAutor Brad | 2012-05-18
Schreibe einen Kommentar