Domanda

Sto cercando di eseguire uno script SQL nel mio test di Junit usando la primavera. Lo script viene utilizzato per impostare i dati per i test. Tuttavia, quando viene eseguito lo script, gli inserti nello script vengono commessi dopo ogni test. La documentazione di primavera dice di non aspettarsi il rollback con DDL, ma tutto nel mio script è DML. Tutto ciò che contiene è inserire dichiarazioni e ottenendo l'ultimo ID INSERT (impostare @BLah= last_insert_id ()).

Sto configurando qualcosa di sbagliato? Lo sto usando contro un database MySQL. La nostra configurazione è la seguente:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/applicationContext.xml" })
@TransactionConfiguration(defaultRollback = true)
public class OrderTestCase extends AbstractTransactionalJUnit4SpringContextTests {

    @Before
    public void runSql() {
        String fileName = StringUtils.replace(getClass().getName(), ".", "/") + ".sql";
        Resource resource = applicationContext.getResource(fileName);
        if (resource.exists()) {
            executeSqlScript(fileName, false);
        } else {
            LOGGER.debug("Resource doesn't exist: {}", resource);
        }
    }

@Test
public void testLoadOrders() {
    Collection<Order> orders= dao.findAll();
    assertTrue(orders.size() == 3);
}
}
.

Ecco cosa penso stia accadendo sulla base di alcune ricerche. La prima chiamata a ExecutiQlscript è in esecuzione in una transazione separata. Il metodo simplejdbctemplate.update di Spring.update è chiamato da ExecutesQLScript. Poiché si tratta di un attacco a una connessione JDBC, che è ottenuta da un pool di connessione, non sono garantito di ottenere la stessa connessione su accessi successivi al DB e quindi non può essere garantito per funzionare nella stessa transazione. Se dovessi fare tutte le mie operazioni DB attraverso il transactionmanager o (fabbrica di sessioni di Hibernate), funzionerebbe a causa di come gli interni portavano le transazioni. Le mie opzioni qui sono a:

    .
  1. Scopri come eseguire simplejdbctemplate.update e il codice attuale successivo che sto provando nella stessa transazione. Penso che io possa farlo, ma i miei sforzi finora sono stati infruttuosi.

  2. fai tutti i miei dati di prova configurati attraverso la sessioneFactory. Quindi, invece di eseguire gli script SQL diritti attraverso JDBC, tiporerei a popolare oggetti modello e persistendo loro attraverso un DAO Ibernazione.

  3. Sono la strada giusta qui? Qualcuno può fornire ulteriori orientamenti?

È stato utile?

Soluzione 2

Sono stato in grado di risolvere questo aggiungendo il seguente "JPavendoRadaPter" alla Dichiarazione della mia EntityManagerFactory.

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
    <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
</bean>
.

Altri suggerimenti

Probabilmente hai abilitato automaticamente la connessione DB.

<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
  <property name="defaultAutoCommit" value="false"/>
</bean>
.

Nota che potresti anche passare questo argomento nell'URL JDBC.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top