如何调试与hsqldb结合的hibernate.hbm2ddl.import_files值的处理?

Ric*_*oek 6 java spring hibernate hsqldb spring-test-mvc

在我正在研究的Java项目中,我为单元测试提供了以下设置:

  • 我正在使用Spring Test MVC,@RunWith(SpringJUnit4ClassRunner.class)@WebAppConfiguration运行单元测试,我创建了一个用于测试应用程序的MockMvc实例webAppContextSetup(webApplicationContext).
  • 我有一个Hibernate配置来设置内存中的HSQLDB,所有表都是基于@Entity类创建的.
  • 在Hibernate配置中,我设置hibernate.hbm2ddl.import_files属性以加载import.sql带有SQL语句的文件来填充(内存中)数据库.

现在,我已经确认了以上所有这些工作:

  • 测试可以成功从内存数据库中插入/检索.
  • import.sql各种测试证实,执行中的SQL语句.

现在问题是:我添加的语句出现的错误import.sql似乎没有在任何地方报告,也没有任何迹象表明发生了错误.相反,后续语句根本不会执行.(我通过测试证实了这一点.)

有没有什么办法,或将这些错误报道,我显然不知道的?这有额外的Hibernate属性吗?

摘自hibernate测试配置:

    <bean id="sessionFactory" name="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.archive.autodetection">class,hbm</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</prop>
                <prop key="hibernate.connection.username">sa</prop>
                <prop key="hibernate.connection.password"></prop>
                <prop key="hibernate.connection.url">jdbc:hsqldb:mem:myschema</prop>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
                <prop key="hibernate.hbm2ddl.import_files">configuration/test/import.sql</prop>
                <prop key="hibernate.hbm2ddl.import_files_sql_extractor">org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor</prop>
                <!-- when using type="yes_no" for booleans, the line below allow booleans in HQL expressions: -->
                <prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop>
            </props>
        </property>
    </bean>
Run Code Online (Sandbox Code Playgroud)

Dai*_*ter 1

我无法像@Julien Kroneg 建议的那样记录异常。

但我能够在方法的 catch 块中放置一个断点,org.hibernate.tool.hbm2ddl.SchemaExport#importScript其中trimmedSql代表正在应用的每个 SQL 语句:

catch ( Exception e ) {
    if (haltOnError) {
        throw new ImportScriptException( "Error during statement execution (file: '"
                + namedReader.getName() + "'): " + trimmedSql, e );
    }
    exceptions.add(e);
    LOG.unsuccessful(trimmedSql);
    LOG.error(e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)

考虑到初始化脚本是静态的而不是真正的业务数据,这可能就足够了,一旦你让它们工作,它们就有希望继续工作