Pregunta

Estoy tratando de ejecutar un script de SQL en mi prueba JUIIT utilizando la primavera. El script se está utilizando para configurar datos para las pruebas. Sin embargo, cuando se ejecuta el script, se están cometiendo los insertos en el script después de cada prueba. La documentación de primavera dice que no debe esperar retroceder con DDL, pero todo en mi script es DML. Todo lo que contiene es insertar las declaraciones y obtener la última ID de inserción (establecer @blah= last_insert_id ()).

¿Estoy configurando algo mal? Estoy usando esto contra una base de datos MySQL. Nuestra configuración es la siguiente:

@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);
}
}

Aquí está lo que creo que está sucediendo en función de algunas investigaciones. La primera llamada a ejecutarseqlscript se está ejecutando en una transacción separada. El método SimplejdbctemPlate.Update.Update se llama por EXECUTESQLSIPT. Debido a que esto es un ámbito a una conexión JDBC, que se obtiene de un grupo de conexiones, no estoy garantizado para obtener la misma conexión en los accesos posteriores al DB y, por lo tanto, no se puede garantizar que se ejecute en la misma transacción.

Si tuviera que hacer todas mis operaciones de DB a través de la transacción, o (Hibernate Session Factory), entonces funcionaría debido a cómo los internos alcanzan las transacciones. Mis opciones aquí son:

  1. Averigüe cómo ejecutar SimplejdBCTEMPLA.UPDATE y el código real posterior que estoy probando en la misma transacción. Creo que puedo hacer esto, pero mis esfuerzos hasta ahora han sido infructuosos.

  2. Haga todos mis datos de prueba configurados a través de la facturación de la sesión. Entonces, en lugar de ejecutar scripts SQL directamente a través de JDBC, estaría poblando objetos modelo y persistiéndolos a través de un DAO Hibernate.

  3. ¿Estoy en la pista correcta aquí? ¿Alguien puede proporcionar más orientación?

¿Fue útil?

Solución 2

Pude resolver esto agregando el siguiente 'jpavendoradapter' a la Declaración de mi 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>

Otros consejos

Probablemente tenga habilitado automáticamente en la conexión 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>

Tenga en cuenta que también podría estar pasando este argumento en la URL de JDBC.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top